Я хотел бы украсить каждое действие контроллера, которое у меня есть в моем проекте. Я хотел бы запустить собственный механизм регистрации и остановить его каждый раз, когда вызывается метод действия.
Как это:
class HomeController
{
public function indexAction()
{
Logger:start();
someLogicInThere();
...
Logger:end();
}
}
Я хотел бы автоматизировать это расширение до некоторого класса или что-то вроде этого.
Мой контроллер конечного класса будет выглядеть так:
class HomeController extends ControllerDecorator
{
public function indexAction()
{
someLogicInThere();
...
}
}
BTW: материал регистратора не имеет большого значения. Мой вопрос - скорее проблема шаблона дизайна
Любая отличная идея?
Вы можете использовать встроенные методы beforeAction (http://www.yiiframework.com/doc/api/1.1/CController#beforeAction-detail) и afterAction (http://www.yiiframework.com/doc/api/1.1/CController # afterAction-detail) внутри вашего ControllerDecorator. Таким образом, вы сможете украсить каждый класс, который расширяет ControllerDecorator.
ps: Я предполагаю, что вы используете Yii. Правильно?
Ваша проблема называется сквозной проблемой. Один из способов справиться с этим - это ориентированное на Аспект программирование.
Вы можете фальсифицировать это в 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, которые анализируют doctype и кэшируют новый созданный класс. Не испытано:
https://github.com/AOP-PHP/AOP
Другим способом решения проблем с перекрестными связями является использование программирования, управляемого событиями. Это не отделяет его на 100%, как АОП, но это более утвержденный шаблон дизайна, особенно в PHP.
preDispatch
и postDispatch
.