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

在Symfony上使用魔术方法进行路由,symfony,magic-methods,Symfony,Magic Methods,在Symfony 4上,我尝试为DefaultController提供一个_调用方法,该方法将能够处理对/api/{model}的所有调用,例如: #config/routes.yml get: path: /api/{model}/ defaults: { _controller: 'App\Controller\DefaultController::get' } DefaultController上没有定义“get”方法,但我有一个_call()方法来处理它 我已经读过关于

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

#config/routes.yml
get:
    path: /api/{model}/
    defaults: { _controller: 'App\Controller\DefaultController::get' }
DefaultController上没有定义“get”方法,但我有一个_call()方法来处理它

我已经读过关于允许您从php代码的其他部分调用这些不存在的方法的,但在routes.yml文件中使用这些方法时却不允许

在拉拉维尔,它运行良好,路线指向DefaultController@get控制器上的_调用方法可以正确地处理它


感谢您的帮助。

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

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

  • 使用
    \u call
    比使用正确的函数定义要慢,而且您知道应该在路由中定义函数时定义函数
  • 开发人员需要更多的反射来理解代码的位置,而初级开发人员甚至不理解逻辑
如果您确实需要一个“全包”函数,您可以从
getAction
函数调用它:

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

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

因此,您基本上是使用_调用来假装控制器有一个名为get的方法?为什么?为什么不添加一个名为get的方法呢?无论如何,下面的答案是正确的。Symfony对控制器方法进行了大量处理。这种方法行不通,我这样做是因为控制器的所有create、read、update和delete方法都会这样做,收集请求参数并将它们发送到各自的命令。因此,为了不重复代码,我打算使用相同的函数(_调用),就像我在Laravel代码中所做的那样(我将它从Laravel移植到Symfony)。如果我必须用另一种方式来做,我会按照@julien说的去做,因为这似乎是更合理的方式,下面的答案肯定是合理的。如果您正在移植现有代码,那么知道您在say read和update之间有共同的功能是可以的,尽管我不太明白如何实现。对于积垢的东西,你可以看一看。它们可能适用于也可能不适用于您的特定情况。我将以这种方式实施,这是更合理的方式。谢谢