【发布时间】: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
查看 Str::slug 用于我的前端 URL 生成,但只是想知道你们如何使用路由等实现它,例如,你们如何将 http://www.example.com/courses/1 更改为 http://www.example.com/courses/this-course
【问题讨论】:
标签: string url laravel-4 friendly-url slug
您可以创建一个相关的模型 Slug,并以您的方法处理课程,如下所示:
$course = Slug::where('slug', $slug) -> firstOrFail() -> course;
【讨论】:
就我而言,我创建了一个辅助函数并使用了以下从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;
}
【讨论】:
【讨论】:
好的,我是这样做的:
// 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;
}
【讨论】:
我也实现了类似的 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);
}
【讨论】:
/1/my-laravel-course 和 /1/lorem-ipsum 的网址将相同