Я хотел бы украсить каждое действие контроллера, которое у меня есть в моем проекте.
Я хотел бы запустить собственный механизм ведения журнала и останавливать его каждый раз, когда вызывается метод действия.
Как это:
class HomeController
{
public function indexAction()
{
Logger:start();
someLogicInThere();
...
Logger:end();
}
}
Я хотел бы автоматизировать это расширение до некоторого класса или что-то вроде этого.
Мой конечный контроллер класса будет выглядеть так:
class HomeController extends ControllerDecorator
{
public function indexAction()
{
someLogicInThere();
...
}
}
КСТАТИ: вещи из регистратора на самом деле не имеют значения. Мой вопрос больше касается дизайна
Есть отличная идея?
Вы можете использовать встроенные методы 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. Правильно?
Ваша проблема называется Межотраслевой концерн. Одним из способов справиться с этим является Аспектно-ориентированное программирование.
Вы можете подделать это в 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-фреймворки, которые анализируют тип документа и кэшируют новый созданный класс.
Не испытано:
https://github.com/AOP-PHP/AOP
Еще один способ решения сквозных проблем заключается в использовании программирование на основе событий. Это не отделяет его на 100%, как AOP, но это более одобренный шаблон проектирования, особенно в PHP.