路由 Laravel 冲突

jac*_*k_0 1 php routing laravel

我必须配置路由来响应这个 url:

  • /一些静态字符串
  • /{类别}/{id}

为此,我在 web.php 文件中编写了以下代码:

Route::get('/SomeStaticString','PagesController@SomeStaticString');
Route::get('/{main_category}/{slug}','PagesController@getArticle')->where('main_category', '^(?!SomeStaticString$).*');
Run Code Online (Sandbox Code Playgroud)

这是处理这些网址的正确方法吗?如果我必须向我的应用程序添加其他 url“SomeStaticString”,什么是最佳路由实现?

小智 5

您总是希望确保在通配符之前定义静态路由,否则路由器会将静态路由误认为是通配符。这是一个快速示例:

//This will work
Route::get('foo', ' YourController@foo');
Route::get('{bar}', 'YourController@bar');

//In this order, foo will never get called
Route::get('{bar}', 'YourController@bar');    
Route::get('foo', ' YourController@foo');
Run Code Online (Sandbox Code Playgroud)

当您开始向路径添加更多段时,您总是希望在其各自子组的后面保留通配符。这就是应该如何对逐渐增长的路由树进行排序。

//This is good
Route::get('foo', ' YourController@foo');
Route::get('foo/bar', ' YourController@bar');
Route::get('foo/{id}', 'YourController@foobar');
Route::get('foo/bar/stuff', 'YourController@extrafoobar');
Route::get('foo/bar/{id}', 'YourController@megafoobar');
Route::get('foo/{bar}/stuff', 'YourController@uberfoobar');
Route::get('foo/{bar}/{id}', 'YourController@finalfoobar');
Run Code Online (Sandbox Code Playgroud)

特别是对于您的情况,您希望像这样开始组织您的路线:

Route::get('/addClickBanner/{id_banner}','PagesController@SomeStaticString');
Route::get('someStaticString/{main_category}/{slug}','PagesController@getArticle')->where('main_category', '^(?!SomeStaticString$).*');
Run Code Online (Sandbox Code Playgroud)