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();