在Symfony上使用魔术方法进行路由
在Symfony 4上,我尝试为DefaultController提供一个_调用方法,该方法将能够处理对/api/{model}的所有调用,例如:在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()方法来处理它 我已经读过关于
#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之间有共同的功能是可以的,尽管我不太明白如何实现。对于积垢的东西,你可以看一看。它们可能适用于也可能不适用于您的特定情况。我将以这种方式实施,这是更合理的方式。谢谢