【问题标题】:Laravel 7 Binding RoutesLaravel 7 绑定路由
【发布时间】:2021-01-02 15:42:14
【问题描述】:

我在 laravel 上声明了这条路线:

Route::get('pages/{page}/{slug}', 'Common\Pages\CustomPageController@show')
    ->middleware(['web', 'prerenderIfCrawler']);

如果您提出以下请求,这条路线可以正常工作:

https://example.com/pages/1/test-page
https://example.com/pages/2/other-page
https://example.com/pages/3/url-test

问题是我还需要一个更友好的网址。

 https://example.com/test-page
 https://example.com/other-page
 https://example.com/url-test

我想删除名为pages 的后缀,页面的数字永远不会改变,并且每个页面都是静态的。

我尝试为每个路由创建静态路由,但无法正常工作。

Route::get('other-page', array('as' => 'other-page', function() {
    return App::make('Common\Pages\CustomPageController')->show(2);
}))->middleware(['web', 'prerenderIfCrawler']);

我将不胜感激。

【问题讨论】:

    标签: php laravel .htaccess routes laravel-7


    【解决方案1】:

    您始终可以在控制器中获取 URL 段,并使用它来了解您所在的页面。如果您不想这样做,您可以在“操作”中传递额外信息来指定页面:

    Route::middleware(['web', 'prerenderIfCrawler'])->group(function () {
        Route::get('test-page', [
            'uses' => 'Common\Pages\CustomPageController@show',
            'page' => 'test-page',
        ]);
        ...
    });
    

    那么你就可以在Controller中获取这些额外的信息了:

    public function show(Request $request)
    {
        $page = $request->route()->getAction('page');
    
        ...
    }
    

    如果您知道所有页面,则可以使用带有正则表达式约束的路由参数将其限制为仅这些页面名称:

    Route::get('{page:slug}', ...)->where('page', 'test-page|other-page|...');
    
    public function show(Page $page)
    {
         ...
    }
    

    【讨论】:

    • 您好,我已在您的网站上向您发送了一封电子邮件。问候
    【解决方案2】:

    您可以像这样使用通配符来捕获您的路线:

    Route::get('/{slug}', 'Common\Pages\CustomPageController@show')
        ->middleware(['web', 'prerenderIfCrawler']);
    

    然后在你的控制器中:

    public function show($slug)
    {
        $page = Page::where('slug', $slug)->first();
        // ...
    }
    

    请注意放置路线的位置。它应该在您的路线的末尾,否则它将捕获您应用的所有请求。

    // ...
    // my other routes
    // ...
    Route::get('/{slug}', ...);
    

    顺便说一句,如果您想使用 slug 属性绑定页面模型,请执行以下操作:

    Route::get('/{page:slug}', 'Common\Pages\CustomPageController@show')->//...
                  ^^^^^^^^^
    

    然后在你的控制器中:

    public function show(Page $page)
    {                    ^^^^^^^^^^
        // ...
    }
    

    查看this section 的文档。

    【讨论】:

      猜你喜欢
      • 2018-02-26
      • 2021-05-24
      • 2016-06-04
      • 2018-01-18
      • 2020-10-03
      • 1970-01-01
      • 2017-06-22
      • 2015-08-28
      • 2018-12-17
      相关资源
      最近更新 更多