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

0

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

Как это:

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

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

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

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

BTW: материал регистратора не имеет большого значения. Мой вопрос - скорее проблема шаблона дизайна

Любая отличная идея?

Теги:
design-patterns
decorator

2 ответа

0
Лучший ответ

Вы можете использовать встроенные методы 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. Правильно?

  • 0
    Я не использую Yii. Zend-Framework 1
  • 0
    Тогда я думаю, что вы должны посмотреть здесь: framework.zend.com/manual/1.12/en/zend.controller.action.html . В частности обратите внимание на метод init (). Это работает как ловушка для каждого действия вашего контроллера. Это то, что вы искали?
Показать ещё 5 комментариев
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, которые анализируют doctype и кэшируют новый созданный класс. Не испытано:

http://go.aopphp.com/

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

Другим способом решения проблем с перекрестными связями является использование программирования, управляемого событиями. Это не отделяет его на 100%, как АОП, но это более утвержденный шаблон дизайна, особенно в PHP.

  • 0
    Я не хочу делать это каждый раз, когда создаю действие в каждом контроллере. Идея черты великолепна, кстати. Я хотел бы что-то более «автоматическое»
  • 0
    Хорошо, если вам нужно вызывать одни и те же методы для каждого действия, я бы подумал написать плагин контроллера и использовать preDispatch и postDispatch .
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню