Php 路由拉威尔冲突

Php 路由拉威尔冲突,php,laravel,routing,Php,Laravel,Routing,我必须配置路由才能响应此url: /某些静态字符串 /{category}/{id} 为此,我在web.php文件中编写了以下代码: Route::get('/SomeStaticString','PagesController@SomeStaticString'); Route::get('/{main_category}/{slug}','PagesController@getArticle')->where('main_category', '^(?!SomeStaticStri

我必须配置路由才能响应此url:

  • /某些静态字符串
  • /{category}/{id}
为此,我在web.php文件中编写了以下代码:

Route::get('/SomeStaticString','PagesController@SomeStaticString');
Route::get('/{main_category}/{slug}','PagesController@getArticle')->where('main_category', '^(?!SomeStaticString$).*');
这是处理这些url的正确方法吗?
如果我必须将其他url“SomeStaticString”添加到我的应用程序中,那么什么是最佳路由实现?

您总是希望确保在定义通配符路由之前定义静态路由,否则路由器会将静态路由误认为是wilcard。下面是一个简单的例子:

//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');
开始向路径添加更多段时,始终希望在其各自子组的后面保留通配符。这就是逐步增长的路由树的排序方式

//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');
特别是对于您的情况,您希望以如下方式组织您的路线:

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

您总是希望确保在定义通配符路由之前先定义静态路由,因为否则路由器会将静态路由误认为wilcard。下面是一个简单的例子:

//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');
开始向路径添加更多段时,始终希望在其各自子组的后面保留通配符。这就是逐步增长的路由树的排序方式

//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');
特别是对于您的情况,您希望以如下方式组织您的路线:

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

你的意思是
->where('main_category','^(?!addClickBanner$).*)?如果
id\u banner
是一个数字,而
slug
不是,那么您可以仅使用路由参数来约束
id\u banner
,如route::get('/{main\u category}/{slug}…)中的路由参数,如果在该路由之前没有明确说明uri,则会抓取每个uri。您应该放置一个类似于
/{main\u category}/{slug}的路由
在您关心的每条路线下方。像
SomeStaticString
这样的新路由应该放置在此路由之上。您是指
->where('main_category','^(?!addClickBanner$).*)?如果
id\u banner
是一个数字,而
slug
不是,那么您可以仅使用路由参数来约束
id\u banner
,如route::get('/{main\u category}/{slug}…)中的路由参数,如果在该路由之前没有明确说明uri,则会抓取每个uri。您应该放置一个类似于
/{main\u category}/{slug}的路由
在您关心的每条路线下方。像
SomeStaticString
这样的新路由应该放在这个路由之上。很好的解释很好的解释