没有调用__callStatic

时间:2015-05-05 16:35:31

标签: php magic-methods

不确定为什么,但它甚至没有达到我所拥有的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',但如果我取出第一个,则第二个永远不会到达。)

1 个答案:

答案 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);
        }
    }
}

我必须警告你,我在编写时没有测试过这种方法,但我希望它能给你一个想法!