【问题标题】:Laravel route with optional part of filename带有可选文件名部分的 Laravel 路由
【发布时间】:2022-10-02 19:52:57
【问题描述】:

通过以下路线,我希望能赶上sitemap.xmlsitemap-0.xml。但它只捕获sitemap-0.xml。你能帮我理解为什么它不起作用吗?

Route::get(\'/sitemap{suffix?}.xml\', \'SitemapController@sitemap\');

然后在控制器中执行以下操作:public function sitemap($suffix = null)

当然,我可以创建一条名为Route::get(\'/sitemap.xml\', \'FeedsController@sitemap\'); 的附加路线,但这似乎是多余的。

    标签: laravel routes


    【解决方案1】:

    如果您通过正则表达式对路由施加约束并将其设为可选,它应该可以工作。请参阅以下路线示例应该可以工作:

    <?php
    
    Route::get('/sitemap{suffix?}.xml', 'SitemapController@sitemap')
        ->where('suffix', '-?([0-9]+)?');
    

    这是为什么?

    Laravel 路由基于 Symfony 路由工作。路由中的可选部分不起作用,因为它是 Symfony 路由的工作方式。因此,如果可选部分之后有任何内容,则 Symfony 路由将不匹配,因为它将成为必需的。

    您已定义如下路线

    '/sitemap{suffix?}.xml'
    

    注意.xml 在可选部分之后使用。所以这部分{suffix?} 现在是必需的。它必须有一些东西来代替suffix。这就是为什么sitemap.xml 不起作用但sitemap-01.xml 起作用的原因。

    新手说明

    Symfony 路由将为sitemap-09.xml 路径生成以下正则表达式:

    "{^/sitemap(?P<suffix>[^/\.]++)\.xml$}sDu"
    

    现在用括号包裹的部分称为命名捕获组.

    (?P<suffix>[^/\.]++)
    

    如果要检查命名捕获组的骨架,如下所示:

    (?P<name>group)
    

    这里团体该正则表达式的一部分表示匹配任何内容除了.xml 之前的正斜杠 (/) 和点 (.)。这意味着它匹配sitemap-0.xml 或将匹配任何代替-0sitemap-0.xml

    因此,当您从 sitemap-0.xml 中省略 -0 时,团体部分(因为它不是可选的)在.xml 之前没有任何匹配项。因此它与sitemap.xml 不匹配。

    要解决此问题,您应该像我在上面所做的那样对路由进行约束,这会产生以下正则表达式:

    "{^/sitemap(?P<suffix>-?(?:[0-9]+)?)\.xml$}sDu"
    

    这里我告诉路由允许-[0-9]可选.因此它匹配两者。

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多