Laravel Slugs与Str :: slug

时间:2013-07-01 09:07:41

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

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

5 个答案:

答案 0 :(得分:11)

好的,我是这样做的:

// 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模型课程,从数据库中获取正确的课程对象。

编辑:您可以在视图中生成以下网址:

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-&gt; url,但是我还没有完成这项工作。我会在做的时候更新答案。

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

    return $this->where('id', $parentId)->first()->slug;
}

答案 1 :(得分:5)

答案 2 :(得分:3)

至于我,我创建了一个辅助函数,并使用了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 :(得分:2)

你可以创建一个相关的模型Slug,并在你的方法中接近这样的过程:

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

答案 4 :(得分: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);
}