我正在努力定义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']]);
我有什么想法或指示如何解决这个问题?或者其他一些切割方式可以做到吗?
答案 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'作为你可能已经知道的项目类别。