带有 Str::slug 的 Laravel Slugs

Posted

技术标签:

【中文标题】带有 Str::slug 的 Laravel Slugs【英文标题】:Laravel Slugs with Str::slug 【发布时间】:2013-06-28 08:33:47 【问题描述】:

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

【问题讨论】:

【参考方案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】:

您可以使用cvierbrock's Eloquent-Sluggable package。

【讨论】:

【参考方案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 的网址将相同

以上是关于带有 Str::slug 的 Laravel Slugs的主要内容,如果未能解决你的问题,请参考以下文章

Laravel文档阅读笔记-Laravel Str slug() Function Example

如何在我的 Laravel 5 应用程序中使用 Illuminate\Support\Str::slug?

如何在我的 Laravel 5 应用程序中使用 Illuminate\Support\Str::slug?

如何从非英语值创建一个 slug?

如何在 laravel 中创建文件夹

Laravel 刀片模板不使用 slug 渲染