在Symfony上使用魔术方法进行路由

时间:2018-08-02 07:34:11

标签: symfony magic-methods

在Symfony 4上,我尝试为DefaultController提供__call方法,该方法将能够处理对/ api / {model}的所有调用,例如:

#config/routes.yml
get:
    path: /api/{model}/
    defaults: { _controller: 'App\Controller\DefaultController::get' }

“ get”方法未在DefaultController上定义,但是我有__call()方法来处理它。

我已经读过有关PropertyAccessor Class的知识,该知识允许您从php代码的其他部分调用这些不存在的方法,但是当在route.yml文件中使用它们时则不能。

在Laravel上,它工作正常,路由指向DefaultController @ get,并且控制器上的__call方法正确处理了它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我不知道为什么这不起作用,但是可能是因为如果您的方法存在,Symfony会进行一些代码自省。

我不认为您应该这样做是出于两个原因:

  • 使用__call比使用正确的函数定义要慢,并且您知道应该在路由中定义函数时对其进行定义
  • 开发人员将需要更多的思考来理解代码的位置,初级开发人员甚至都不了解逻辑

如果您确实需要“全部捕获”功能,则可以从getAction函数中调用它:

class SomeController
{
    public function get() {
        return $this->catchAll(__METHOD__);
    }

    public function catchAll($method) {
        // do whatever you want
    }
}