带有 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?