我最近将Symfony的路由和HttpFoundation组件插入我的旧应用程序中,并且我慢慢开始将所有代码转换为。
到目前为止,所有东西都工作得非常好,但我认为我已经按照我构建控制器的方式以及路由器调用它们的方式走向了一个兔子洞。以下是我的前端控制器中的一些代码:
// look up the controller and action defined in routes.yml
$parameter = $router->match($request->getPathInfo());
// call the action and get the output
$output = call_user_func('MyCompany\\Controller\\' . $parameter['_controller']);
// send the output in the response and so forth
// ....
因此,call_user_func行实际上会调用类似MyCompany\Controller\GeneralController::indexAction
的内容,最终返回html输出,该输出将在响应中发送。
由于我设置了所有内容的方式,我必须使用return self::display('filename.tpl');
之类的语句。这对我来说似乎不对。
是否有更好的方法来调用这些控制器操作?
答案 0 :(得分:1)
您可能想要使用ControllerResolver。或者您可能希望更直接地使用HttpKernel,它可以为您解决问题。
如果您使用ControllerResolver,它将创建一个“可调用的”,并且还可以获取您可以执行的参数$response = call_user_func_array($controller, $arguments);
使用HttpKernel或AppKernel还有很多其他好处,它们提供了更多的脚手架。
答案 1 :(得分:1)
你遇到的问题实际上是依赖注入。self::display
可能会使用一些全局变量(对象)为你渲染一些模板,而你需要做的就像是{{1} }。在没有声明服务容器等并将它们连接到路由器的情况下,您可以轻松地执行此操作,即为所有控制器提供一些常见参数,即:$this->renderer->render('filename.tpl')
变为call_user_func('MyCompany\\Controller\\' . $parameter['_controller']);
或者您可以创建Service Locator(以symfony术语表示的服务容器)并将其传递给所有控制器,并让它们获取自己的依赖项。