【发布时间】:2018-05-22 12:58:53
【问题描述】:
我正在将基于 Silex 的应用程序重写为 Symfony 4,因为 Silex 将在一段时间后被弃用。到目前为止一切都很好,但我对嵌套路由有疑问。
我在 Silex 应用程序中有很多嵌套(子路由),并分配了不同的控制器。
$app->match('/api', function (ControllerCollection $api) {
$api->get('/homepage', 'ControllerOne::index');
$api->get('/contact', 'ControllerTwo::index');
});
这在 Silex 中很容易,但现在在 Symfony 4 中,我使用注释来管理路由,似乎我找不到对这些路由进行分组的方法。
这很烦人,尤其是当涉及到带有 _locale 的路由时,因为这些路由的语法很长而且仍然.. 如果有一天我需要更改 _locale 前缀,这不是到处都有它的好方法类似于/home/{_locale}/。
ControllerOne extends Controller
{
/**
* @Route("/{_locale}/",
* name="root",
* methods="GET",
* requirements={"_locale": "en|fr"}
* )
*
* @return Response
*/
public function index(): Response
{
return $this->render('some.html.twig');
}
}
ControllerTwo extends Controller
{
/**
* @Route("/{_locale}/homepage",
* name="homepage",
* methods="GET",
* requirements={"_locale": "en|fr"}
* )
*
* @return Response
*/
public function index(): Response
{
return $this->render('some2.html.twig');
}
}
更新
我有一个想法来创建某种PrefixedController,在其中我指定类的前缀和PrefixedController 的扩展而不是基本的Controller,但它似乎不起作用。
/**
* @Route("/{_locale}", requirements={"_locale": "en|fr"})
*/
controller PrefixedController extends Controller
{
}
controller ControllerOne extends PrefixedController
{
/**
* @Route("/", methods="GET")
* @Return Response
*/
public function index(): Response
{
return $this->render('some.html.twig');
}
}
但是当我导航到/en/ 时,它无法匹配路线。
【问题讨论】:
-
看看路由前缀选项,应该和Silex一样。
-
就语言环境问题而言,您可以使用参数来简化一些内容:symfony.com/doc/current/routing/… 不过,不要认为这对您来说真的是一个通用的解决方案。
-
@Cerad 谢谢你。它部分解决了
_locale和一些前缀的问题,但我想这不是最好的解决方案,因为例如无法使用动态变量生成前缀。但总比没有好,再次感谢。 -
在 yaml 文件中定义路由可能会更好。然后,万一您决定更改所有路线,您将只需要编辑几个文件。而且我怀疑你可能有点想多了。
-
@yceruto 太好了,它有效。非常感谢你。您可以考虑将其添加为答案并写更多关于它的内容,然后我会将其标记为正确。
标签: php symfony silex symfony4