在 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
}
}
在 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
}
}