Permalink
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
161 lines (127 sloc) 6.03 KB

Слушатели

Создание слушателя

Система компонента сохранения работает на основе шаблона Observer.

Все слушатели должны реализовывать ListenerInterface, только так они могут подписаться на наблюдателя.

Шаблон Observer имеет две сущности:

  • слушатель - реализует ListenerInterface
  • наблюдатель - реализует ObserverInterface

Слушатели подписываются на события наблюдателя, после чего каждый слушатель получает информацию о файле в момент сохранения файла. Каждый слушатель может производить над файлом свои действия, в результате чего производится видоизменение файла или различные побочные дейтсвия.

Интерфейс слушателя реализует такой функционал:

interface ListenerInterface
{
    /**
     * Присоединение к Observer
     */
    public function attach(ObserverInterface $observer);
}

Функция attach позволяет навеситься на наблюдателя и получать от него нужные события с нужной информацией.

Базовая реализация слушателя:

class Manager implements ListenerInterface
{
    /**
     * Событие на сохранение
     */
    public function handle(Event $event)
    {
       // Работа с данными из слушателя
    }

    /**
     * Присоединение к Observer
     *
     * @param ObserverInterface $observer
     */
    public function attach(ObserverInterface $observer)
    {
        $observer->on(Event::SAVE_EVENT, [$this, 'handle']);
    }
}

, где:

  • Event::{TYPE_EVENT} - тип события, которого хотим получать и обрабатывать события
  • handle - срабатываемый callback (типа callable), вызываемый при срабатывании установленного события
  • attach - реализация интерфейса ListenerInterface
  • $observer->on() - функция прикрепления слушателя к наблюдателю. Аргументы: тип события, объект типа callable

Всего есть два встроенных типа:

  • Event::SAVE_EVENT - событие на сохранение файла
  • Event::DELETE_EVENT - событие на удаление файла

Каждое событие срабатывает момент того или иного действия, зависящего от выполняемой процедуры.

Конфигурирование слушателя

Каждый слушатель может конфигурироваться.

Конфигурирование обеспечивают репозитории:

  • UploadedFile
  • RemoteUploadedFile
  • LocalUploadedFile

Каждый из репозиториев реализует интерфейс UploadInterface, где есть функция:

    /**
     * Конфигурирование загрузчика
     */
    public function configure($config);

, где:

  • $config - конфигурация, коей будут конфигурироваться слушатели
  • configure - функция, которая конфигурирует слушателей

Конфигурирование репозиторя

При конфигурировании репозитория можно задать нужные параметры как слушателям, так и событиям. Поле для настроек репозиториев - repositoryOptions. Данное поле имеет два внутренних поля:

  • listeners
  • events

Поле listeners содержит в себе массив конфигураций слушателей, в каждой ячейке массива описывается подключение слушателя и его конфигурации.

Аналогично слушателям, можно подключать любой callback через привязку к событиям:

'events' => [
    Event::SAVE_EVENT => [
        function (Event $event) {
              // реализация срабатываемого события
        }
    ]
]

Примерная подключения слушателей

function behaviors()
{
    return [
        [
            'class' => FileUploadBehavior::className(),
            'attribute' => 'image',
            'repository' => UploadedFile::class,
            'repositoryOptions' => [
                'listeners' =>
                    [
                        [
                            'class' => ListenerExample::class,
                            // Конфигурация слушателя
                        ],
                        [
                            'class' => ListenerExample::class,
                            // Конфигурация слушателя
                        ]
                    ],
                'events' => [
                    Event::SAVE_EVENT => [
                        function (Event $event) {
                            // Реализация срабатываемого события
                        },
                        function (Event $event) {
                            // Реализация срабатываемого события
                        }
                    ]
                ]
            ]
        ],
    ];
}