我希望能够通过短链接找到一篇文章,例如articles/ID
,但我也希望通过完整链接articles/ID/category/slug
到达那里。但我不能让以下工作:
// Route file:
Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create).*');
Route::pattern('slug', '^(?!edit).*');
Route::get('articles/{id}/{cat?}/{slug?}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
// Controller file:
public function show($id, $cat = null, $slug = null)
{
dd('1: ' . $cat . ' | 2:' . $slug);
}
以下链接articles/28/ullam/vel-repellendus-aut-est-est-esse-fugiat
给出了结果:
string(53) "1: ullam/vel-repellendus-aut-est-est-esse-fugiat | 2:"
我不明白为什么它没有拆分,如果我删除路由定义中的?
它就有效。
我已经尝试过这个解决方案https://stackoverflow.com/a/21865488/3903565并且可行,但不是针对控制器时。为什么呢?
更新;我最终重新安排了我的路线文件:
Route::pattern('id', '[0-9]+');
// Articles
Route::get('articles/create', ['as' => 'articles.create', 'uses' => 'ArticlesController@create']);
Route::get('articles/edit/{id}', ['as' => 'articles.edit', 'uses' => 'ArticlesController@edit']);
Route::get('articles/{id}/{category?}/{slug?}', ['as' => 'articles.show', 'uses' => 'ArticlesController@show']);
Route::get('articles/{category?}', ['as' => 'articles.index', 'uses' => 'ArticlesController@index']);
Route::resource('articles', 'ArticlesController', ['only' => ['store', 'update', 'destroy']]);
答案 0 :(得分:2)
这是你唯一的路线吗?或者你有一个不同的指向也显示?我刚刚添加了这个作为我的第一条路线:
Route::get('articles/{id}/{cat?}/{slug?}', function($id, $cat, $slug)
{
dd($id.': ' . $cat . ' | 2:' . $slug);
});
得到了这个结果:
28: ullam | 2:vel-repellendus-aut-est-est-esse-fugiat
更改路线的顺序,将第一条路线作为最具体的路线,将最后一条路线作为最通用的路线。此外,如果您有任何模式,他们可能会对您的结果进行干预。
看起来某些模式和可选参数(?)存在问题,所以如果你这样做了
Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create).*');
Route::pattern('slug', '^(?!edit).*');
Route::get('articles/{id}/{cat}/{slug}', function($id, $cat, $slug)
{
dd($id.': ' . $cat . ' | 2:' . $slug);
});
它会正常工作。我的建议是不要过多地重用路由,如果你有一个特定的路由,你为它创建一个路由命令,并在最通用的路由命令之前添加它:
Route::get('articles/{id}/create', function($id)
{
dd('this is the create route');
});
Route::get('articles/{id}/{cat}/{slug}', function($id, $cat, $slug)
{
dd($id.': ' . $cat . ' | 2:' . $slug);
});
与寻找正则表达式模式的复杂性相比,创建新路由的成本较低,并尝试在其中找到自己的方式。在项目上有新的合作者,甚至为了将来的自我,更简单,更好。
在Laravel 4.3中,您可以访问路由缓存,这使得路由几乎立即被触发。
答案 1 :(得分:1)
问题仅在于前瞻模式。
您需要$
和不包括/
的课程才能使其发挥作用。
所以他们在这里:
Route::pattern('id', '[0-9]+');
Route::pattern('cat', '^(?!create$)[^/]*');
Route::pattern('slug', '^(?!edit$)[^/]*');
Route::get('articles/{id}/{cat?}/{slug?}', function($id, $cat, $slug)
{
dd($id.': ' . $cat . ' | 2:' . $slug);
});