【问题标题】:show name instead of id in a url using laravel routing使用 laravel 路由在 url 中显示名称而不是 id
【发布时间】:2015-03-06 08:01:25
【问题描述】:

我在 laravel 4 中定义了一个看起来像这样的路由:

Route::get('/books/{id}', 'HomeController@showBook');

在 url 例如它显示 /books/1 ,现在我问有没有办法显示书名,但也将 id 作为参数保留在路由中以用于 SEO 目的

提前致谢

【问题讨论】:

    标签: laravel routes


    【解决方案1】:

    您可以根据需要向 url 添加任意数量的参数,如下所示:

    Route::get('/books/{id}/{name}', 'HomeController@showBook');
    

    现在,当您要创建此页面的 url 时,您可以执行以下操作:

    URL::action('HomeController@showBook', ['id' => 1, 'name' => 'My awesome book']);
    

    更新:

    如果您确定永远不会有两本书具有相同的标题,您可以在 url 中使用书名。你只需要这样做:

    Route::get('/books/{name}', 'HomeControllers@showBook');
    

    在您的showBook 函数中,您需要使用name 而不是id 从数据库中获取图书。我强烈建议同时使用 id 和 name,否则你会遇到麻烦,因为我认为书名不会总是唯一的。

    【讨论】:

    • 我认为您误解了我想要做什么。在 url 栏中,我不想有一个看起来 /books/1 而不是 /book/name-of-book 的 url。你的回答能胜任吗?
    • 我真的不喜欢这样做,我想坚持使用 id 作为参数从数据库中查找图书。但在网址栏中显示其名称
    • 如果你不想在地址栏中显示id,你不能凭空找到id。您需要通过书名找到这本书。
    • 我认为应该有一个解决方案,将 id 作为参数发送给操作,但在地址栏中显示其名称。 Laravel 非常灵活地提供这个功能.. 只需要幸运地找到它
    • 在http请求中不可能以任何其他方式添加id,你只有url给你的数据。所以 laravel 将无法做到这一点。您可以尝试的唯一其他选择是通过发布数据发送 id,但是您需要为每个链接创建一个表单,或者使用查询字符串将它们添加到 url,但这些对 SEO 根本不友好。
    【解决方案2】:

    你也可以这样做:

    Route::get('books/{name}', function($name){
        $url = explode("-", $name);
        $id = $url[0];
        return "Book #$id";
    });
    

    因此,如果您传递如下网址,则可以通过 id 获取图书:http://website.url/books/1-book-name

    【讨论】:

      【解决方案3】:

      如果您使用 laravel 8,这可能会有所帮助。
      在您的控制器中添加此

      public function show(Blog $blog)
      {
          return view('dashboard.Blog.show',compact('blog'));
      }
      

      在你的 web.php 中添加这个

      Route::get('blog/{blog}', [\App\Http\Controllers\BlogController::class,'show'])->name('show');
      

      然后将此添加到您的模型中(我使用博客作为我的模型)

       public function getRouteKeyName()
      {
          return 'title'; // db column name you would like to appear in the url.
      }
      

      注意:请让您的列名是唯一的(良好做法)。
      结果:http://127.0.0.1:8000/blog/HelloWorld。 ....单个博客的 URL
      所以没有更多 http://127.0.0.1:8000/blog/1
      不客气。

      【讨论】:

        【解决方案4】:

        你也可以使用模型绑定check more on laravel docs

        例如

        Route::get('book/{book:name}',[BookController::class,'getBook'])->name('book');
        

        "book/{book:name}" 中的 name 属性应该是唯一的。

        【讨论】:

          猜你喜欢
          • 2018-06-11
          • 2021-08-26
          • 1970-01-01
          • 2021-12-27
          • 1970-01-01
          • 2014-11-03
          • 1970-01-01
          • 2017-02-03
          • 2018-01-04
          相关资源
          最近更新 更多