Php 装饰一般控制器动作

Php 装饰一般控制器动作,php,design-patterns,decorator,Php,Design Patterns,Decorator,我想装饰每个控制器的行动,我在我的项目。 我想启动一个自定义记录器引擎,并在每次调用操作方法时停止它 像这样: class HomeController { public function indexAction() { Logger:start(); someLogicInThere(); ... Logger:end(); } } 我想将其自动扩展到某个类或类似的东西 我的最终类控制器将如下所

我想装饰每个控制器的行动,我在我的项目。 我想启动一个自定义记录器引擎,并在每次调用操作方法时停止它

像这样:

class HomeController
{
    public function indexAction() 
    {
         Logger:start();
         someLogicInThere();
         ...
         Logger:end();
    }
}
我想将其自动扩展到某个类或类似的东西

我的最终类控制器将如下所示:

class HomeController extends ControllerDecorator
{
    public function indexAction() 
    {
         someLogicInThere();
         ...
    }
}
顺便说一句:记录器的东西其实并不重要。我的问题更多的是设计模式问题


有什么好主意吗?

您可以在ControllerDecorator内使用内置的操作前和操作后方法。 这样,您就可以装饰ControllerDecorator扩展的每个类

ps:我假设你正在使用Yii。对吗?

您的问题被调用。处理这一问题的一种方法是

在PHP>=5.4中,您可以使用以下方法来伪造:

作为一个实验,我已经自动化了编写基类的过程:

我不会真的在生产中使用它,因为它需要很多资源

更好地研究解析doctype并缓存新创建的类的AOP框架。 未测试:


处理横切关注点的另一种方法是使用。这并不像AOP那样100%地将其分开,但它是一种更受认可的设计模式,尤其是在PHP中。

那么我认为您应该看看这里:。特别要注意init方法。它是控制器每个动作的钩子。这就是您要搜索的吗?使用前调度和后调度不是一个坏主意,但在这种方法中,我没有足够的关于调用的实际操作的信息,如方法名称、参数等……preDispatch方法的范围中不存在$request对象吗?我从未使用过ZF,但据我所知,这是意料之中的。。。我将进一步挖掘,并试图找到更多关于这方面的信息。@SomethingWicked,如我所写:使用控制器插件,您就可以访问请求对象。公共函数preDispatchZend_controller_request_Abstract$request{$request->getActionName$request->getParam'param'}我不想每次在每个控制器中创建操作时都这样做。特质想法是伟大的BTW.我想要更多的“自动”好,如果你需要调用相同的方法,在每一个行动,我会考虑写一个,并使用预调度AND邮政调度挂钩。你看到了一张完整的调度流程的漂亮图片。那么完全隔离的服务呢?@Mauro你到底是什么意思?控制器插件是隔离的。
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();