在Laravel中使用类别定义SEO路线

时间:2014-09-05 11:33:29

标签: laravel laravel-4 seo laravel-routing

我正在努力定义Laravel中的路由,它将提供我想要的URL层次结构,我甚至不知道它是否可能......

基本上这就是我想要的:

/projects                 // Show all projects
/projects/create          // Create a new project
/projects/edit/id         // Edit project with ID
/projects/example         // Show all projects in category example
/projects/example/id/slug // Show project with ID

我正在使用ID的模式:

Route::pattern('id', '[0-9]+');

我已经完成了大部分工作,但我正在努力区分/projects/create/projects/example(其中示例可以是任何类别)。

我当前的路线配置如下:

Route::get('projects/{cat}/{id}/{slug?}', ['as' => 'projects.show', 'uses' => 'ProjectsController@show']);
Route::get('projects/{cat}', ['as' => 'projects.category', 'uses' => 'ProjectsController@category']);
Route::get('projects/edit/{id}', ['as' => 'projects.edit', 'uses' => 'ProjectsController@edit']);
Route::resource('projects', 'ProjectsController', ['except' => ['show', 'edit']]);

我有什么想法或指示如何解决这个问题?或者其他一些切割方式可以做到吗?

4 个答案:

答案 0 :(得分:2)

当然有一些解决方法,比如在路线中添加人工(@)或重新排列路线顺序。

然而,还有另一种可靠的方法可以确保达到目标 - 模式:

更新:如果您想在网址{cat}之后添加内容,则应使用下面提供的第二种模式。

// either global
Route::pattern('cat', '^(?!create$).*');
// Route::pattern('cat', '^(?!create$)[^/]*');

// or just for this very route
Route::get('projects/{cat}', ['as' => 'projects.category', 'uses' => 'ProjectsController@category'])
  ->where('cat', '^(?!create$).*');
  // ->where('cat', '^(?!create$)[^/]*');

使用此模式,您的路线不会匹配/projects/create

答案 1 :(得分:0)

我为用户个人资料执行此操作,例如...

路由:: get(' @ {username}',[' as' =>' profile_path','使用' =>' UsersController @ show']);

@符号为您提供了一个很好的指示器。

laracasts的代码。

答案 2 :(得分:0)

尝试替换类别路线,因为创建我可以作为一个类别

Route::get('projects/{cat}', ['as' => 'projects.category', 'uses' => 'ProjectsController@category']);

Route::get('projects/{cat}', ['as' => 'projects.category', 'uses' => 'ProjectsController@category', 'except' => ['create']]);

答案 3 :(得分:0)

由于从上到下读取路线,您可能的解决方案是重新订购路线。

// Matches your resourceful routes (including 'projects/create')
Route::resource('projects', 'ProjectsController', ['except' => ['show', 'edit']]);

// None of the resourceful routes found? Try to match the ones below
Route::get('projects/{cat}/{id}/{slug?}', ['as' => 'projects.show', 'uses' => 'ProjectsController@show']);
Route::get('projects/{cat}', ['as' => 'projects.category', 'uses' => 'ProjectsController@category']);
Route::get('projects/edit/{id}', ['as' => 'projects.edit', 'uses' => 'ProjectsController@edit']);

当然,唯一需要注意的是你不能使用'create'作为你可能已经知道的项目类别。