2016-09-06 9 views
1

Я пытаюсь получить окончательную ссылку в событии CakePHP (v3.x). В моем методе Controler add У меня есть общественная функцияCakePHP add event listener

add() 
{ 
     $event = new Event('Model.Comment.created', $this, [ 
      'comment' => $comment 
     ]); 
     $this->eventManager()->dispatch($event); 
} 

и есть мой класс слушатель установить:

namespace App\Event; 

use Cake\Log\Log; 
use Cake\Event\EventListener; 

class CommentListener implements EventListener { 

public function implementedEvents() { 
    return array(
     'Model.Comment.created' => 'updatePostLog', 
    ); 
} 

public function updatePostLog($event, $entity, $options) { 
    Log::write(
    'info', 
    'A new comment was published with id: ' . $event->data['id']); 
} 
} 

Но не может получить слушатель настроен правильно, особенно мое приложение, зная, что мой CommentListener класс существует.

+0

есть ли сообщение об ошибке или предупреждения? –

+0

Нет, работает, но я ничего не делаю, я знаю, что мне не хватает бита, который связывает их вместе, и я не уверен, как это реализовано. –

+0

Глядя на документы: http://book.cakephp.org/3.0/ru/core-libraries/events.html#registering-listeners Я смущен, где эти строки идут: // Прикрепите объект UserStatistic менеджеру событий заказа $ статистика = новый UserStatistic(); $ this-> Orders-> eventManager() -> on ($ статистика); –

ответ

1

У меня был точно такой же вопрос, то я нашел этот пост: Events in CakePHP 3 – A 4 step HowTo

Это действительно очищенную вещи для меня и описывает, что последний шаг связывания, что вы нуждающихся. Предполагая, что ваш класс Слушатель находится в папке Event под src вашего приложения, все, что вам нужно сделать, это шаг 4 в статье я приспособил пример кода на ваш пример:

Наконец, мы должен зарегистрировать этот слушатель. Для этого мы будем использовать глобально доступный EventManager. Поместите следующий код в конце вашей конфигурации/bootstrap.php

use App\Event\CommentListener; 
use Cake\Event\EventManager; 

$CommentListener = new CommentListener(); 
EventManager::instance()->attach($CommentListener); 

выше глобальный слушатель. Также возможно зарегистрировать событие на уровне Model или Controller + Views в соответствии с документами CakePhp (CakePHP 3.x Events System). Он предлагает между строками, что вы можете зарегистрировать слушателя на нужном вам слое - возможно, AppController в обратном вызове beforeFilter или initialize, хотя я только протестировал обратный вызов beforeFilter.

Дополнение от CakePHP 3.0.0 и вперед

Функция attach() теперь устаревшее. Функция замены называется on(), и поэтому код должен выглядеть так:

use App\Event\CommentListener; 
use Cake\Event\EventManager; 

$CommentListener = new CommentListener(); 
EventManager::instance()->on($CommentListener); // REPLACED 'attach' here with 'on'