10

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

4

5 回答 5

12

好的,我是这样做的:

// 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>

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

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

    return $this->where('id', $parentId)->first()->slug;
}
于 2013-07-01T11:48:22.330 回答
5

您可以使用cvierbrock 的 Eloquent-Sluggable 包

于 2014-02-11T14:00:03.143 回答
4

至于我,我创建了一个辅助函数并使用了从这里获取的以下方法。

 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;
}
于 2014-05-18T19:16:45.857 回答
2

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

$course = Slug::where('slug', $slug) -> firstOrFail() -> course;
于 2015-04-22T06:43:57.737 回答
1

我也实现了类似的 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);
}
于 2013-07-02T11:02:55.837 回答