Laravel路由奇怪的行为

时间:2017-12-22 11:50:06

标签: php laravel laravel-5 laravel-routing

我有一个域/子域项目。为了通过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;
}

要到达我使用此网址的路线:https://example.com/events/slug-example

问题是路线被击中,因为当我改变它时我看到了响应,但是我没有得到slug,而是我得到了Region个对象。

如果我这样做:

public function getView($region, $slug)
{
    return $slug;
}

然后我回到了slu ..但是我不知道这怎么可能,我怎么能这样做(我作为现有项目的另一个开发者来了)。

我尝试评论所有中间件,但它仍然是相同的。如果我没有明确说出来,我怎么能做一些填充方法?

编辑

我注意到路线文件中存在绑定:

Route::bind('region', function ($value) {
    ...
});

现在如果我dd($value)我得到了变量。这个价值是如何填补的?从哪里可以转发?

2 个答案:

答案 0 :(得分:1)

快速查看它应该有效,但也许你正在验证其他网址。

请确保放置:

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作为第一个参数是正确的行为,因为路由模型绑定和其他路由参数将是第2个,第3个等等。

答案 1 :(得分:0)

而不是

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');
});