【问题标题】:Laravel Slugs with Str::slug带有 Str::slug 的 Laravel Slugs
【发布时间】:2025-12-01 07:20:03
【问题描述】:

查看 Str::slug 用于我的前端 URL 生成,但只是想知道你们如何使用路由等实现它,例如,你们如何将 http://www.example.com/courses/1 更改为 http://www.example.com/courses/this-course

【问题讨论】:

    标签: string url laravel-4 friendly-url slug


    【解决方案1】:

    您可以创建一个相关的模型 Slug,并以您的方法处理课程,如下所示:

    $course = Slug::where('slug', $slug) -> firstOrFail() -> course;
    

    【讨论】:

      【解决方案2】:

      就我而言,我创建了一个辅助函数并使用了以下从here 获取的方法。

       public static function getSlug($title, $model) {
          $slug = Str::slug($title);
          $slugCount = count( $model->whereRaw("url REGEXP '^{$slug}(-[0-9]*)?$'")->get() );
          return ($slugCount > 0) ? "{$slug}-{$slugCount}" : $slug;
      }
      

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          好的,我是这样做的:

          // I have a slug field in my courses table and a slug field in my categories table, along with a category_id field in my courses table.
          
          // Route 
          
          Route::get('courses/{categorySlug}/{slug?}', function($categorySlug, $slug) {
              $course = Course::leftJoin('categories', 'categories.id', 'courses.category_id')
                  ->where('categories.slug', $categorySlug)
                  ->where('courses.slug', $slug)
                  ->firstOrFail();
          
              return View::make('courses.show')->with('course', $course);
          });
          

          像魅力一样工作。它获取 $categorySlug 和 $slug 变量,然后使用它们过滤 Eloquent 模型 Course 以从数据库中获取正确的课程对象。

          编辑:您可以在视图中生成一个 URL,例如:

          http://www.example.com/courses/it-training/mcse

          通过执行以下操作:

          <a href="{{ URL::to('courses/'.$course->category->parentCategorySlug($course->category->parent_id).'/'.$course->category->slug.'/'. $course->slug) }}" title="{{ $course->title }}">{{ $course->title }}</a>
          

          我的类别中有一个方法,如下所示,用于检索父类别 slug。这可以通过使用某种演示者类来更好地实现,这将允许您简单地使用 $course->url 但我还没有开始这样做。当我这样做时,我会更新答案。

          public function parentCategorySlug($parentId)
          {
              if ($parentId === '0')
              {
                  return $this->slug;
              }
          
              return $this->where('id', $parentId)->first()->slug;
          }
          

          【讨论】:

            【解决方案5】:

            我也实现了类似的 URL 映射,但我更喜欢在请求的 URL 中同时包含 ID 和 slug,如下所示:

            http://www.example.com/courses/1/my-laravel-course

            此方法允许我从 URL 中给出的 ID 中获取请求的 course 对象,而不必将 slug 存储在我的数据库表中。

            Route::post('courses/(:num)/(:any)', function ($courseid, $slug) {
                $course = Course::where('id', '=', $courseid)->get();
                return View::make('courses.show')->with('course', $course);
            }
            

            【讨论】:

            • 如何让这个url在控制器中显示出来?
            • 网址应该是唯一的,在这种情况下,/1/my-laravel-course/1/lorem-ipsum 的网址将相同