Загрузить компонент на основе текущего действия
Для чего-то более простого и, возможно, менее подверженного ошибкам, вы можете захотеть загрузить компонент в метод контроллеров initialize()
на основе текущего действия, т.е. что-то вроде
if ($this->request->param('action') === 'theAction') {
$this->loadComponent('TheComponent');
}
Подделка событий контроллера
Лично я бы не рекомендовал делать это, но для полноты картины...
startup()
— это обратный вызов для события Controller.startup
. Вы можете легко подделать это событие, но это может быть не очень хорошей идеей, поскольку операции над событием не будут иметь такого же эффекта, как если бы это было реальное, реальное событие, инициированное контроллером Controller.startup
. Видеть
\Cake\Controller\Controller:: процесс запуска()
Результат используется в процессе диспетчеризации. Поэтому, если компонент попытается возиться с этим, это не будет иметь никакого эффекта, что может привести к дальнейшим проблемам.
Также не забывайте, что есть также Controller.initialize
, который сопоставляется с обратным вызовом beforeFilter()
, вы тоже пропустите его при поздней загрузке компонента.
Так что имейте в виду эти проблемы и возможные дополнительные побочные эффекты с компонентами, которые могут потребовать каких-то действий до фактического вызова действий. Имея это в виду, вот базовый пример, который включает обработку результатов событий.
$event = new \Cake\Event\Event('Controller.initialize', this);
$this->TheComponent->beforeFilter($event);
if ($event->result instanceof \Cake\Network\Response) {
return $event->result;
}
$event = new \Cake\Event\Event('Controller.startup', this);
$this->TheComponent->startup($event);
if ($event->result instanceof \Cake\Network\Response) {
return $event->result;
}
person
ndm
schedule
09.08.2016