不确定为什么,但它甚至没有达到我所拥有的var_dump()
。让我们看一下如何实现它。
<?php
namespace ImageUploader\Controllers;
class ApplicationController implements \Lib\Controller\BaseController {
....
public function beforeAction($actionName = null, $actionArgs = null){}
public function afterAction($actionName = null, $actionArgs = null){}
public static function __callStatic($name, $args) {
var_dump('hello?'); exit;
if (method_exists($this, $name)) {
$this->beforeAction($name, $args);
$action = call_user_func(array($this, $name), $args);
$this->afterAction($name, $args);
return $action;
}
}
}
正如我们所看到的,我想在调用操作之前和之后执行某些操作,无论您是否实现了该方法。但是永远不会达到var_dump
。
此课程扩展为:
<?php
namespace ImageUploader\Controllers;
use \Freya\Factory\Pattern;
class DashboardController extends ApplicationController {
public function beforeAction($actionName = null, $actionArgs = null) {
var_dump($actionName, $actionArgs); exit;
}
public static function indexAction($params = null) {
Pattern::create('\Freya\Templates\Builder')->renderView(
'dash/home',
array(
'flash' => new \Freya\Flash\Flash(),
'template' => Pattern::create('\Freya\Templates\Builder')
)
);
}
....
}
现在我做:DashboardController::indexAction();
它应该退出......除非我遗漏了什么。如果是这样的话 - 它是什么?
即使实现的var_dump
中的before_action(...)
也从未到过(因为第一个是obvi',但如果我取出第一个,则第二个永远不会到达。)
答案 0 :(得分:2)
cin
- 因为实际定义了__callStatic
,所以在不打扰indexAction
的情况下执行它。 (Documentation)
实现您想要做的事情的方法可以是将控制器包装在装饰器中:
__callStatic()
然后,在您的代码中,您可以执行以下操作:
class ExtendedApplicationController
{
/**
* @var \Lib\Controller\BaseController
*/
protected $controller;
function __construct(\Lib\Controller\BaseController $controller) {
$this->controller = $controller;
}
function __callStatic($name, $args) {
if (method_exists($this->controller, 'beforeAction')) {
call_user_func_array(array($this->controller, 'beforeAction'), $name, $args);
}
call_user_func_array(array($this->controller, $name), $args);
if (method_exists($this->controller, 'afterAction')) {
call_user_func_array(array($this->controller, 'afterAction'), $name, $args);
}
}
}
我必须警告你,我在编写时没有测试过这种方法,但我希望它能给你一个想法!