由依赖注入容器管理的控制器和" action"后缀

时间:2016-02-03 14:38:18

标签: php symfony

在Symfony 2+中,当您描述为特定路线执行的方法时,您可以使用以下任一方法:

MyBundle:MyController:hello

或者,假设您setup MyController to be managed by the dependency injection container为服务my_controller

my_controller:helloAction

为什么Symfony在一个案例中期望Action后缀而在另一个案例中不期望?{/ p>

1 个答案:

答案 0 :(得分:3)

  

为什么第二个变种需要 helloAction而不是hello,   比如第一个变种?

<强>都能跟得上!
不要被误导。

定义controller as service时,控制器方法名称可以是您想要的任何名称 因此,如果在您的控制器中有一个名为hello的方法,那么您必须在路由配置中仅将其定义为hello,而不是helloAction(这是错误的)。这就是为什么symfony 期望为有效的可调用名称。

另一方面,当从默认框架控制器扩展时,Symfony期望所有方法名称都有Action后缀(这只是一个约定而不是技术要求,请参阅Symfony\Component\HttpKernel\KernelInterface#ControllerNameParserline 78 )。

这是一个实际的例子:

namespace AppBundle\Controller;

/** My controller as service */
class DefaultController 
{
    public function hello() 
    {
        return new Symfony\Component\HttpFoundation\Response('Hello!');
    }
}

我的路线设置:

# app/config/touting.yml
hello:
    path: /hello
    # NOTE: Method name is hello, not helloAction
    defaults: {_controller: app.controller.default:hello}