Skip to content

Add Custom Event

Add Custom Event

Overview

In this guide you will learn how to create your own event. You can read more about events in the Symfony documentation.

Prerequisites

In order to create your own event for your plugin, you first need a plugin as base. Therefore, you can refer to the Plugin Base Guide.

INFO

Refer to this video on Event dispatching and handling which is a live coding example on custom events. Also available on our free online training "Shopware 6 Backend Development".

Event interfaces and classes

In Shopware, you have multiple interfaces and classes for different types of events, in the following you can find a list of them:

  • ShopwareEvent: This interface is just a basic event providing a Context, we need for almost all events.
  • ShopwareSalesChannelEvent: This interface extends from ShopwareEvent and additionally provides a SalesChannelContext.
  • SalesChannelAware: This interface provides the SalesChannelId.
  • GenericEvent: This interface will be used if you want to give your event a specific name like the database events (e.g. product.written.). Otherwise, you have to reference to the event class.
  • NestedEvent: This class will be used for events using other events for example the EntityDeletedEvent extends from the EntityWrittenEvent.
  • BusinessEventInterface: This interface extends from ShopwareEvent and will be used for dynamically assignment and is always named.

Create the event class

First, we create a new class for our event, which we name ExampleEvent. In this example we implement the Shopware\Core\Framework\Event\ShopwareSalesChannelEvent. As mentioned above our class already implements a method for the SalesChannelContext and the Context. Now we pass an ExampleEntity and the SalesChannelContext through the constructor and create a function which returns our ExampleEntity.

Therefore, this is how your event class could look like:

php
// <plugin root>/src/Core/Content/Example/Event/ExampleEvent.php
<?php declare(strict_types=1);

namespace Swag\BasicExample\Core\Content\Example\Event;

use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\Event\ShopwareSalesChannelEvent;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Swag\BasicExample\Core\Content\Example\ExampleEntity;

class ExampleEvent implements ShopwareSalesChannelEvent
{
    protected ExampleEntity $exampleEntity;

    protected SalesChannelContext $salesChannelContext;

    public function __construct(ExampleEntity $exampleEntity, SalesChannelContext $context)
    {
        $this->exampleEntity = $exampleEntity;
        $this->salesChannelContext = $context;
    }

    public function getExample(): ExampleEntity
    {
        return $this->exampleEntity;
    }

    public function getContext(): Context
    { 
        return $this->salesChannelContext->getContext();
    }

    public function getSalesChannelContext(): SalesChannelContext
    {
        return $this->salesChannelContext;
    }
}

Fire the event

After we've created our entity class, we need to fire our new event. For this we need the service event_dispatcher which provides a method called dispatch. In this example we created a service ExampleEventService which fires our event. Below you can find the example implementation.

php
// <plugin root>/src/Service/ExampleEventService.php
<?php declare(strict_types=1);

namespace Swag\BasicExample\Service;

use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Swag\BasicExample\Core\Content\Example\Event\ExampleEvent;
use Swag\BasicExample\Core\Content\Example\ExampleEntity;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class ExampleEventService
{
    private EventDispatcherInterface $eventDispatcher;

    public function __construct(EventDispatcherInterface $eventDispatcher)
    {
        $this->eventDispatcher = $eventDispatcher;
    }

    public function fireEvent(ExampleEntity $exampleEntity, SalesChannelContext $context)
    {
        $this->eventDispatcher->dispatch(new ExampleEvent($exampleEntity, $context));
    }
}

Next steps

Now that you know how to create your own event, you may want to act on it. To get a grip on this, head over to our Listening to events guide.