Events
Events are used to communicate between different aspects of the Nextcloud eco system. They are used in the Nextcloud server internally, for server-to-apps communication as well as inter-app communication.
Overview
The term "events" is a bit broad in Nextcloud and there are multiple ways of emitting them.
OCP event dispatcher
This mechanism is a versatile and typed approach to events in Nextcloud's php code. It uses objects rather than just passing primitives or untyped arrays. This should help provide a better developer experience while lowering the risk of unexpected changes in the API that are hard to find after the initial implementation.
Naming scheme
The name should reflect the subject and the actions. Suffixing event classes with Event makes it easier to recognize their purpose.
For example, if a user is created, a UserCreatedEvent will be emitted.
Events are usually emitted after the event has happened. If it's emitted before, it should be prefixed with Before.
Thus BeforeUserCreatedEvent is emitted before the user data is written to the database.
Writing events
As a rule events are dedicated classes extending \OCP\EventDispatcher\Event.
<?php
use OCP\EventDispatcher\Event;
namespace OCA\MyApp\Event;
class AddEvent extends Event {}
The event above allows signalling that something happened. But in many cases you want to actually transport data like the affected resource with the event. Then the events act as simple data transfer objects. Therefore they need a constructor that takes the arguments, private members to store them and getters to access the values in listeners.
<?php
use OCP\EventDispatcher\Event;
use OCP\IUser;
class UserCreatedEvent extends Event {
private IUser $user;
public function __construct(IUser $user) {
parent::__construct();
$this->user = $user;
}
public function getUser(): IUser {
return $this->user;
}
}
Writing a listener
A listener can be a simple callback function (or anything else that is callable, or a dedicated class.
Listener callbacks
You can use simple callback to react on events. They will receive the event object as first and only parameter. You can type-hint the base Event class or the subclass you expect and register for.
<?php
use OCA\MyApp\Event\AddEvent;
use OCP\AppFramework\App;
use OCP\EventDispatcher\IEventDispatcher;
namespace OCA\MyApp\AppInfo;
class Application extends App {
public function __construct() {
parent::__construct('myapp');
/* @var IEventDispatcher $dispatcher */
$dispatcher = $this->getContainer()->query(IEventDispatcher::class);
$dispatcher->addListener(AddEvent::class, function(AddEvent $event) {
// ...
});
}
}
Listener classes
A class that can handle an event will implement the \OCP\EventDispatcher\IEventListener interface. Class names should end with Listener.
<?php
use OCA\MyApp\Event\AddEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
namespace OCA\MyApp\Event;
class AddTwoListener implements IEventListener {
public function handle(Event $event): void {
if (!($event instanceOf AddEvent)) {
return;
}
$event->addToCounter(2);
}
}
In the Application.php the event and the listener class are connected. The class is instantiated only when the actual event is fired.
<?php
use OCA\MyApp\Event\AddEvent;
use OCA\MyApp\Listener\AddTwoListener;
use OCP\AppFramework\App;
use OCP\EventDispatcher\IEventDispatcher;
namespace OCA\MyApp\AppInfo;
class Application extends App {
public function __construct() {
parent::__construct('myapp');
/* @var IEventDispatcher $eventDispatcher */
$dispatcher = $this->getContainer()->get(IEventDispatcher::class);
$dispatcher->addServiceListener(AddEvent::class, AddTwoListener::class);
}
}
Available Events
Here you find an overview of the public events that can be consumed in apps. See their source files for more details.
\OCA\DAV\Events\AddressBookCreatedEvent
This event is triggered when a user creates a new address-book.
\OCA\DAV\Events\AddressBookDeletedEvent
This event is triggered when a user deletes an address-book.
\OCA\DAV\Events\AddressBookUpdatedEvent
This event is triggered when a user updates an address-book.
\OCA\DAV\Events\CachedCalendarObjectCreatedEvent
This event is triggered when a cached calendar object is being created while fetching a calendar-subscription.
\OCA\DAV\Events\CachedCalendarObjectDeletedEvent
This event is triggered when a cached calendar object is being deleted while fetching a calendar-subscription.
\OCA\DAV\Events\CachedCalendarObjectUpdatedEvent
This event is triggered when a cached calendar object is being updated while fetching a calendar-subscription.
\OCA\DAV\Events\CalendarCreatedEvent
This event is triggered when a user creates a new calendar.
\OCA\DAV\Events\CalendarDeletedEvent
This event is triggered when a user deletes a calendar.
\OCA\DAV\Events\CalendarObjectCreatedEvent
This event is triggered when a user creates a calendar-object.
\OCA\DAV\Events\CalendarObjectDeletedEvent
This event is triggered when a user deletes a calendar-object.
\OCA\DAV\Events\CalendarObjectUpdatedEvent
This event is triggered when a user updates a calendar-object.
\OCA\DAV\Events\CalendarPublishedEvent
This event is triggered when a user publishes a calendar.
\OCA\DAV\Events\CalendarUnpublishedEvent
This event is triggered when a user unpublishes calendar.
\OCA\DAV\Events\CalendarUpdatedEvent
This event is triggered when a user updates a calendar.
\OCA\DAV\Events\CardCreatedEvent
This event is triggered when a user creates a new card in an address-book.
\OCA\DAV\Events\CardDeletedEvent
This event is triggered when a user deletes a card in an address-book.
\OCA\DAV\Events\CardUpdatedEvent
This event is triggered when a user updates a card in an address-book.
OCA\DAV\Events\SabrePluginAddEvent
This event is triggered during the setup of the SabreDAV server to allow the registration of additional plugins.
\OCA\DAV\Events\SabrePluginAuthInitEvent
This event is triggered during the setup of the SabreDAV server to allow the registration of additional authentication backends.
\OCA\DAV\Events\SubscriptionCreatedEvent
This event is triggered when a user creates a new calendar-subscription.
\OCA\DAV\Events\SubscriptionDeletedEvent
This event is triggered when a user deletes a calendar-subscription.
\OCA\DAV\Events\SubscriptionUpdatedEvent
This event is triggered when a user updates a calendar subscription.
\OCA\Files\Event\LoadAdditionalScriptsEvent
This event is triggered when the files app is rendered. It can be used to add additional scripts to the files app.
\OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent
Emitted before the rendering step of the public share page happens. The event holds a flag that specifies if it is the authentication page of a public share.
\OCA\Files_Trashbin\Events\MoveToTrashEvent
Emitted after a file or folder is moved to the trashbin.
\OCA\Settings\Events\BeforeTemplateRenderedEvent
This event is triggered right before the user management template is rendered.
\OCA\User_LDAP\Events\GroupBackendRegistered
This event is triggered right after the LDAP group backend is registered.
\OCA\User_LDAP\Events\UserBackendRegistered
This event is triggered right after the LDAP user backend is registered.
OCP\Accounts\UserUpdatedEvent
This event is triggered when the account data of a user was updated.
OCP\App\Events\AppDisableEvent
This event is triggered when an app is disabled.
OCP\App\Events\AppEnableEvent
This event is triggered when an app is enabled.
OCP\App\Events\AppUpdateEvent
This event is triggered when an app is updated.
OCP\App\ManagerEvent
Class ManagerEvent
OCP\AppFramework\Http\Events\BeforeLoginTemplateRenderedEvent
Emitted before the rendering step of the login TemplateResponse.
OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent
Emitted before the rendering step of each TemplateResponse. The event holds a flag that specifies if an user is logged in.
OCP\Authentication\Events\AnyLoginFailedEvent
Emitted when the authentication fails
OCP\Authentication\Events\LoginFailedEvent
Emitted when the authentication fails, but only if the login name can be associated with an existing user.
OCP\Authentication\Events\TokenInvalidatedEvent
Emitted when an authentication token is invalidated.
OCP\Authentication\TwoFactorAuth\RegistryEvent
OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed
OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed
OCP\Authentication\TwoFactorAuth\TwoFactorProviderDisabled
OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserDisabled
OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserEnabled
OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserRegistered
OCP\Authentication\TwoFactorAuth\TwoFactorProviderForUserUnregistered
OCP\Authentication\TwoFactorAuth\TwoFactorProviderUserDeleted
OCP\BeforeSabrePubliclyLoadedEvent
Dispatched before Sabre is loaded when accessing public webdav endpoints This can be used to inject a Sabre plugin for example
OCP\Calendar\Events\CalendarObjectCreatedEvent
OCP\Calendar\Events\CalendarObjectDeletedEvent
OCP\Calendar\Events\CalendarObjectMovedEvent
OCP\Calendar\Events\CalendarObjectMovedToTrashEvent
OCP\Calendar\Events\CalendarObjectRestoredEvent
OCP\Calendar\Events\CalendarObjectUpdatedEvent
OCP\Collaboration\AutoComplete\AutoCompleteEvent
OCP\Collaboration\AutoComplete\AutoCompleteFilterEvent
OCP\Collaboration\Reference\RenderReferenceEvent
Event emitted when apps might render references like link previews or smart picker widgets. This can be used to inject scripts for extending that. Further details can be found in the :ref:`Reference providers` deep dive.
OCP\Collaboration\Resources\LoadAdditionalScriptsEvent
This event is used by apps to register their own frontend scripts for integrating projects in their app. Apps also need to dispatch the event in order to load scripts during page load
OCP\Comments\CommentsEntityEvent
Class CommentsEntityEvent
OCP\Comments\CommentsEvent
Class CommentsEvent
OCP\Config\BeforePreferenceDeletedEvent
OCP\Config\BeforePreferenceSetEvent
OCP\Console\ConsoleEvent
Class ConsoleEvent
OCP\Contacts\Events\ContactInteractedWithEvent
An event that allows apps to notify other components about an interaction between two users. This can be used to build better recommendations and suggestions in user interfaces. Emitters should add at least one identifier (uid, email, federated cloud ID) of the recipient of the interaction.
OCP\DB\Events\AddMissingColumnsEvent
Event to allow apps to register information about missing database columns This event will be dispatched for checking on the admin settings and when running occ db:add-missing-columns which will then create those columns
OCP\DB\Events\AddMissingIndicesEvent
Event to allow apps to register information about missing database indices This event will be dispatched for checking on the admin settings and when running occ db:add-missing-indices which will then create those indices
OCP\DB\Events\AddMissingPrimaryKeyEvent
Event to allow apps to register information about missing database primary keys This event will be dispatched for checking on the admin settings and when running occ db:add-missing-primary-keys which will then create those keys
OCP\DirectEditing\RegisterDirectEditorEvent
Event to allow to register the direct editor.
OCP\EventDispatcher\GenericEvent
Class GenericEvent convenience re-implementation of SymfonyComponentGenericEvent against OCPEventDispatcherEvent
OCP\Federation\Events\TrustedServerRemovedEvent
OCP\Files\Cache\AbstractCacheEvent
OCP\Files\Cache\CacheEntryInsertedEvent
Event for when an existing entry in the cache gets inserted
OCP\Files\Cache\CacheEntryRemovedEvent
Event for when an existing entry in the cache gets removed
OCP\Files\Cache\CacheEntryUpdatedEvent
Event for when an existing entry in the cache gets updated
OCP\Files\Cache\CacheInsertEvent
Event for when a new entry gets added to the cache
OCP\Files\Cache\CacheUpdateEvent
Event for when an existing entry in the cache gets updated
OCP\Files\Config\Event\UserMountAddedEvent
Event emitted when a user mount was added.
OCP\Files\Config\Event\UserMountRemovedEvent
Event emitted when a user mount was removed.
OCP\Files\Config\Event\UserMountUpdatedEvent
Event emitted when a user mount was moved.
OCP\Files\Events\BeforeDirectFileDownloadEvent
This event is triggered when a user tries to download a file directly.
OCP\Files\Events\BeforeFileScannedEvent
OCP\Files\Events\BeforeFileSystemSetupEvent
Event triggered before the file system is setup
OCP\Files\Events\BeforeFolderScannedEvent
OCP\Files\Events\BeforeZipCreatedEvent
This event is triggered before a archive is created when a user requested downloading a folder or multiple files. By setting successful to false the tar creation can be aborted and the download denied.
OCP\Files\Events\FileCacheUpdated
OCP\Files\Events\FileScannedEvent
OCP\Files\Events\FolderScannedEvent
OCP\Files\Events\InvalidateMountCacheEvent
Used to notify the filesystem setup manager that the available mounts for a user have changed
OCP\Files\Events\Node\BeforeNodeCopiedEvent
OCP\Files\Events\Node\BeforeNodeCreatedEvent
OCP\Files\Events\Node\BeforeNodeDeletedEvent
OCP\Files\Events\Node\BeforeNodeReadEvent
OCP\Files\Events\Node\BeforeNodeRenamedEvent
OCP\Files\Events\Node\BeforeNodeTouchedEvent
OCP\Files\Events\Node\BeforeNodeWrittenEvent
OCP\Files\Events\Node\FilesystemTornDownEvent
Event fired after the filesystem has been torn down
OCP\Files\Events\Node\NodeCopiedEvent
OCP\Files\Events\Node\NodeCreatedEvent
OCP\Files\Events\Node\NodeDeletedEvent
OCP\Files\Events\Node\NodeRenamedEvent
OCP\Files\Events\Node\NodeTouchedEvent
OCP\Files\Events\Node\NodeWrittenEvent
OCP\Files\Events\NodeAddedToCache
OCP\Files\Events\NodeAddedToFavorite
OCP\Files\Events\NodeRemovedFromCache
OCP\Files\Events\NodeRemovedFromFavorite
OCP\Files\ObjectStore\Events\BucketCreatedEvent
OCP\Files\Template\BeforeGetTemplatesEvent
OCP\Files\Template\FileCreatedFromTemplateEvent
OCP\Files\Template\RegisterTemplateCreatorEvent
OCP\FilesMetadata\Event\MetadataBackgroundEvent
MetadataBackgroundEvent is an event similar to MetadataLiveEvent but dispatched on a background thread instead of live thread. Meaning there is no limit to the time required for the generation of your metadata.
OCP\FilesMetadata\Event\MetadataLiveEvent
MetadataLiveEvent is an event initiated when a file is created or updated. The app contains the Node related to the created/updated file, and a FilesMetadata that already contains the currently known metadata.
Setting new metadata, or modifying already existing metadata with different value, will trigger the save of the metadata in the database.
OCP\FilesMetadata\Event\MetadataNamedEvent
MetadataNamedEvent is an event similar to MetadataBackgroundEvent completed with a target name, used to limit the refresh of metadata only listeners capable of filtering themselves out. Meaning that when using this event, your app must implement a filter on the event's registered name returned by getName()
- This event is mostly triggered when a registered name is added to the files scan
i.e. ./occ files:scan --generate-metadata [name]
OCP\Group\Events\BeforeGroupChangedEvent
OCP\Group\Events\BeforeGroupCreatedEvent
OCP\Group\Events\BeforeGroupDeletedEvent
OCP\Group\Events\BeforeUserAddedEvent
OCP\Group\Events\BeforeUserRemovedEvent
OCP\Group\Events\GroupChangedEvent
OCP\Group\Events\GroupCreatedEvent
OCP\Group\Events\GroupDeletedEvent
OCP\Group\Events\SubAdminAddedEvent
OCP\Group\Events\SubAdminRemovedEvent
OCP\Group\Events\UserAddedEvent
OCP\Group\Events\UserRemovedEvent
OCP\Log\Audit\CriticalActionPerformedEvent
Emitted when the admin_audit app should log an entry
OCP\Log\BeforeMessageLoggedEvent
Even for when a log item is being logged
OCP\Mail\Events\BeforeMessageSent
Emitted before a system mail is sent. It can be used to alter the message.
OCP\OCM\Events\ResourceTypeRegisterEvent
Use this event to register additional OCM resources before the API returns them in the OCM provider list and capability
OCP\Preview\BeforePreviewFetchedEvent
Emitted before a file preview is being fetched. It can be used to block preview rendering by throwing a OCP\Files\NotFoundException
OCP\Profile\BeforeTemplateRenderedEvent
Emitted before the rendering step of the public profile page happens.
OCP\SabrePluginEvent
OCP\Security\CSP\AddContentSecurityPolicyEvent
Allows to inject something into the default content policy. This is for example useful when you're injecting Javascript code into a view belonging to another controller and cannot modify its Content-Security-Policy itself. Note that the adjustment is only applied to applications that use AppFramework controllers.
WARNING: Using this API incorrectly may make the instance more insecure. Do think twice before adding whitelisting resources. Please do also note that it is not possible to use the disallowXYZ functions.
OCP\Security\Events\GenerateSecurePasswordEvent
Event to request a secure password to be generated.
Since Nextcloud 31 this event also provides a getContext method allowing to apply different rules for different password context like account passwords or share passwords.
OCP\Security\Events\ValidatePasswordPolicyEvent
This event can be emitted to request a validation of a password. If a password policy app is installed and the password is invalid, an OCPHintException will be thrown.
Since Nextcloud 31 this event also provides a getContext method allowing to apply different rules for different password context like account passwords or share passwords.
OCP\Security\FeaturePolicy\AddFeaturePolicyEvent
Event that allows to register a feature policy header to a request.
OCP\Settings\Events\DeclarativeSettingsGetValueEvent
OCP\Settings\Events\DeclarativeSettingsRegisterFormEvent
OCP\Settings\Events\DeclarativeSettingsSetValueEvent
OCP\SpeechToText\Events\TranscriptionFailedEvent
This Event is emitted if a transcription of a media file using a Speech-To-Text provider failed
OCP\SpeechToText\Events\TranscriptionSuccessfulEvent
This Event is emitted when a transcription of a media file happened successfully
OCP\SystemTag\ManagerEvent
Class ManagerEvent
OCP\SystemTag\MapperEvent
Class MapperEvent
OCP\TaskProcessing\Events\GetTaskProcessingProvidersEvent
Event dispatched by the server to collect Task Processing Providers and custom Task Types from listeners (like AppAPI). Listeners should add their providers and task types using the addProvider() and addTaskType() methods.
OCP\TaskProcessing\Events\TaskFailedEvent
OCP\TaskProcessing\Events\TaskSuccessfulEvent
OCP\TextProcessing\Events\TaskFailedEvent
OCP\TextProcessing\Events\TaskSuccessfulEvent
OCP\TextToImage\Events\TaskFailedEvent
OCP\TextToImage\Events\TaskSuccessfulEvent
OCP\User\Events\BeforePasswordUpdatedEvent
Emitted before the user password is updated.
OCP\User\Events\BeforeUserCreatedEvent
Emitted before a new user is created on the back-end.
OCP\User\Events\BeforeUserDeletedEvent
OCP\User\Events\BeforeUserIdUnassignedEvent
Emitted before removing the mapping between an external user and an internal userid
OCP\User\Events\BeforeUserLoggedInEvent
OCP\User\Events\BeforeUserLoggedOutEvent
Emitted before a user is logged out.
OCP\User\Events\OutOfOfficeChangedEvent
Emitted when a user's out-of-office period has changed
OCP\User\Events\OutOfOfficeClearedEvent
Emitted when a user's out-of-office period is cleared
OCP\User\Events\OutOfOfficeEndedEvent
Emitted when a user's out-of-office period ended
OCP\User\Events\OutOfOfficeScheduledEvent
Emitted when a user's out-of-office period is scheduled
OCP\User\Events\OutOfOfficeStartedEvent
Emitted when a user's out-of-office period started
OCP\User\Events\PasswordUpdatedEvent
Emitted when the user password has been updated.
OCP\User\Events\PostLoginEvent
OCP\User\Events\UserChangedEvent
OCP\User\Events\UserCreatedEvent
Emitted when a new user has been created on the back-end.
OCP\User\Events\UserDeletedEvent
OCP\User\Events\UserFirstTimeLoggedInEvent
OCP\User\Events\UserIdAssignedEvent
Emitted by backends (like user_ldap) when a user created externally is mapped for the first time and assigned a userid
OCP\User\Events\UserIdUnassignedEvent
Emitted after removing the mapping between an external user and an internal userid
OCP\User\Events\UserLiveStatusEvent
OCP\User\Events\UserLoggedInEvent
OCP\User\Events\UserLoggedOutEvent
Emitted when a user has been logged out successfully.
OCP\User\GetQuotaEvent
Event to allow apps to
OCP\WorkflowEngine\Events\LoadSettingsScriptsEvent
Emitted when the workflow engine settings page is loaded.
OCP\WorkflowEngine\Events\RegisterChecksEvent
OCP\WorkflowEngine\Events\RegisterEntitiesEvent
OCP\WorkflowEngine\Events\RegisterOperationsEvent
Hooks
Hooks are used to execute code before or after an event has occurred. This is for instance useful to run cleanup code after users, groups or files have been deleted. Hooks should be registered in the :doc:`Bootstrapping process <../app_development/bootstrap>`.
Available hooks
The scope is the first parameter that is passed to the listen method, the second parameter is the method and the third one the callback that should be executed once the hook is being called, e.g.:
<?php
// listen on user predelete
$callback = function($user) {
// your code that executes before $user is deleted
};
$userManager->listen('\OC\User', 'preDelete', $callback);
Hooks can also be removed by using the removeListener method on the object:
<?php
// delete previous callback
$userManager->removeListener(null, null, $callback);
The following hooks are available:
Session
Injectable from the ServerContainer with the \OCP\IUserSession service.
Hooks available in scope \OC\User:
preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
changeUser (\OC\User\User $user, string $feature, string $value)
preDelete (\OC\User\User $user)
postDelete (\OC\User\User $user)
preCreateUser (string $uid, string $password)
postCreateUser (\OC\User\User $user)
preLogin (string $user, string $password)
postLogin (\OC\User\User $user, string $password)
logout ()
UserManager
Injectable from the ServerContainer with the \OCP\IUserManager service.
Hooks available in scope \OC\User:
preSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
postSetPassword (\OC\User\User $user, string $password, string $recoverPassword)
preDelete (\OC\User\User $user)
postDelete (\OC\User\User $user)
preCreateUser (string $uid, string $password)
postCreateUser (\OC\User\User $user, string $password)
GroupManager
Hooks available in scope \OC\Group:
preAddUser (\OC\Group\Group $group, \OC\User\User $user)
postAddUser (\OC\Group\Group $group, \OC\User\User $user)
preRemoveUser (\OC\Group\Group $group, \OC\User\User $user)
postRemoveUser (\OC\Group\Group $group, \OC\User\User $user)
preDelete (\OC\Group\Group $group)
postDelete (\OC\Group\Group $group)
preCreate (string $groupId)
postCreate (\OC\Group\Group $group)
Filesystem root
Injectable from the ServerContainer by calling the method getRootFolder(), getUserFolder() or getAppFolder().
To enable these events for your app you should add the following to your info.xml file:
<types>
<filesystem/>
</types>
Filesystem hooks available in scope \OC\Files:
preWrite (\OCP\Files\Node $node)
postWrite (\OCP\Files\Node $node)
preCreate (\OCP\Files\Node $node)
postCreate (\OCP\Files\Node $node)
preDelete (\OCP\Files\Node $node)
postDelete (\OCP\Files\Node $node)
preTouch (\OCP\Files\Node $node, int $mtime)
postTouch (\OCP\Files\Node $node)
preCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)
postCopy (\OCP\Files\Node $source, \OCP\Files\Node $target)
preRename (\OCP\Files\Node $source, \OCP\Files\Node $target)
postRename (\OCP\Files\Node $source, \OCP\Files\Node $target)
Filesystem scanner
Filesystem scanner hooks available in scope \OC\Files\Utils\Scanner:
scanFile (string $absolutePath)
scanFolder (string $absolutePath)
postScanFile (string $absolutePath)
postScanFolder (string $absolutePath)
Public emitter
tbd