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

Using magic methods on Symfony for routing

在 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 代码的其他部分调用这些不存在的方法,但当它们用于 routes.yml 文件时则不能.

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

感谢您的帮助。

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

顺便说一下,我认为您不应该这样做,原因有二:

  • 使用 __call 比使用适当的函数定义要慢,而且您知道应该像在路由中定义函数那样定义函数
  • 开发人员需要更多思考才能理解代码所在的位置,而初级开发人员甚至连逻辑都不懂

如果您确实需要 "catch all" 函数,您可以从 getAction 函数中调用它:

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

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