【问题标题】:Grouped routes in multiple controllers in Symfony 4Symfony 4 中多个控制器中的分组路由
【发布时间】: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


【解决方案1】:

这可以在导入路由资源的主路由文件中完成。在 Symfony 4 中,它位于 config/routes/annotations.yaml。然后为导入的路由提供前缀 /{_locale} 使用 prefix 选项:

# config/routes/annotations.yaml
controllers:
    resource: '../src/Controller/'
    type: annotation
    prefix: /{_locale}

从新路由资源加载的每个路由的路径现在将以占位符 /{_locale} 为前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2013-06-11
    • 2021-08-10
    • 2018-08-15
    • 2019-01-21
    • 2015-05-22
    相关资源
    最近更新 更多