Украсьте общие действия контроллера

Я хотел бы украсить каждое действие контроллера, которое у меня есть в моем проекте.
Я хотел бы запустить собственный механизм ведения журнала и останавливать его каждый раз, когда вызывается метод действия.

Как это:

class HomeController
{
public function indexAction()
{
Logger:start();
someLogicInThere();
...
Logger:end();
}
}

Я хотел бы автоматизировать это расширение до некоторого класса или что-то вроде этого.

Мой конечный контроллер класса будет выглядеть так:

class HomeController extends ControllerDecorator
{
public function indexAction()
{
someLogicInThere();
...
}
}

КСТАТИ: вещи из регистратора на самом деле не имеют значения. Мой вопрос больше касается дизайна

Есть отличная идея?

0

Решение

Вы можете использовать встроенные методы beforeAction (http://www.yiiframework.com/doc/api/1.1/CController#beforeAction-detail) и после действия (http://www.yiiframework.com/doc/api/1.1/CController#afterAction-detail), внутри вашего контроллера-декоратора.
Таким образом, вы сможете украсить каждый класс, который расширяет ControllerDecorator.

PS: я предполагаю, что вы используете Yii. Правильно?

0

Другие решения

Ваша проблема называется Межотраслевой концерн. Одним из способов справиться с этим является Аспектно-ориентированное программирование.

Вы можете подделать это в PHP> = 5.4 с Черты:

trait Logger
{
public function indexAction()
{
echo 'logging before<br>';

parent::indexAction();

echo 'logging after<br>';
}
}

class HomeControllerBase
{
public function indexAction()
{
echo 'indexAction<br>';
}
}

class HomeController extends HomeControllerBase
{
use Logger;
}

$homeController = new HomeController();
$homeController->indexAction();

В качестве эксперимента я автоматизировал этот процесс написания базового класса:

https://github.com/bitworking/AOP

Я бы не стал использовать это на производстве, потому что для этого нужно много ресурсов.

Лучше взглянуть на AOP-фреймворки, которые анализируют тип документа и кэшируют новый созданный класс.
Не испытано:

http://go.aopphp.com/

https://github.com/AOP-PHP/AOP

Еще один способ решения сквозных проблем заключается в использовании программирование на основе событий. Это не отделяет его на 100%, как AOP, но это более одобренный шаблон проектирования, особенно в PHP.

0

По вопросам рекламы [email protected]