Laravel 路由异常行为
Laravel routing strange behavior
我有一个 domain/subdomain 项目。为了通过slug看到事件,我做了这样的路线:
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
});
在我的页面没有正确加载之后,我在控制器中做了一个转储:
public function getView($slug)
{
return $slug;
}
要到达我正在使用的路线 URL:https://example.com/events/slug-example
。
问题是当我更改路由时看到响应时路由被命中,但我没有收到 slug,而是收到 Region
对象。
如果我这样做:
public function getView($region, $slug)
{
return $slug;
}
然后我把子弹拿回来。但我不知道这怎么可能,我该怎么做(我是现有项目的另一个开发人员)。
我试着把所有的中间件都注释掉了,还是一样。如果我没有明确说明,我什至如何让一些东西填充方法?
编辑
我注意到路由文件中正在进行绑定:
Route::bind('region', function ($value) {
...
});
现在,如果我 dd($value)
我会取回变量。这个值是怎么填的?从哪里可以转发?
快速查看应该可以,但也许您正在验证其他 url。
确保你输入:
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
在您显示的路线末尾的路线。
编辑
如果您认为情况并非如此并且您没有缓存路由,您应该 运行:
php artisan route:list
验证您的路线。
EDIT2
经OP在评论中解释后,访问站点的域名为:
{region}.example.com
因此在控制器中将 $region
作为第一个参数是正确的行为,因为路由模型绑定和其他路由参数将是第二个、第三个等等。
而不是
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
});
尝试
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
});
我有一个 domain/subdomain 项目。为了通过slug看到事件,我做了这样的路线:
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
});
在我的页面没有正确加载之后,我在控制器中做了一个转储:
public function getView($slug)
{
return $slug;
}
要到达我正在使用的路线 URL:https://example.com/events/slug-example
。
问题是当我更改路由时看到响应时路由被命中,但我没有收到 slug,而是收到 Region
对象。
如果我这样做:
public function getView($region, $slug)
{
return $slug;
}
然后我把子弹拿回来。但我不知道这怎么可能,我该怎么做(我是现有项目的另一个开发人员)。
我试着把所有的中间件都注释掉了,还是一样。如果我没有明确说明,我什至如何让一些东西填充方法?
编辑
我注意到路由文件中正在进行绑定:
Route::bind('region', function ($value) {
...
});
现在,如果我 dd($value)
我会取回变量。这个值是怎么填的?从哪里可以转发?
快速查看应该可以,但也许您正在验证其他 url。
确保你输入:
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
在您显示的路线末尾的路线。
编辑
如果您认为情况并非如此并且您没有缓存路由,您应该 运行:
php artisan route:list
验证您的路线。
EDIT2
经OP在评论中解释后,访问站点的域名为:
{region}.example.com
因此在控制器中将 $region
作为第一个参数是正确的行为,因为路由模型绑定和其他路由参数将是第二个、第三个等等。
而不是
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
});
尝试
Route::prefix('events')->namespace('Content\Controller')->group(function () {
Route::get('/', 'EventController@getIndex')->name('event.index');
Route::post('load-more-ajax/{region?}', 'EventController@postLoadMoreAjax');
Route::any('sorted-ajax/{region?}', 'EventController@anySortedAjax');
Route::get('category/{category_slug}/{subcategory_slug?}', 'EventController@getCategory');
Route::get('{slug}', 'EventController@getView')->name('event.show');
Route::get('{slug}/edit', 'EventController@getEdit')->name('event.edit');
});