在web.php laravel

时间:2017-11-02 08:15:51

标签: php laravel laravel-5

我的web.php中有2条路线

1)Route::get('/{url}', 'MenuController@menu');

提供网址:

  • /菜单

2)Route::get('/{name}', 'HomeSlideviewController@index')->name('promotiondetail');

提供网址:

  • / menu(路线1中的不同页面,但同名)
  • /食品

如果路线=同名,我想使用2路线如果路线1没有路径,我想使用路线1它将使用路线2。在web.php中他们无论如何都要做

之类的事情
if(Route::get('/{url}', 'MenuController@menu')) is null use

`Route::get('/{name}', 'HomeSlideviewController@index')->name('promotiondetail');`

现在在我的web.php中我这样做

 Route::get('/{url}', 'MenuController@menu');
 Route::get('/{name}', 'HomeSlideviewController@index')->name('promotiondetail');

当我去/食物它将找不到页面。

更新

在我的控制器中我试试这个

try {
    // if find url
}
} catch (\Exception $e) {
    //if not find url
    return redirect()->route('promotiondetail', $url);
}   

并且它返回错误重定向了你太多次

更新3

$ url = food

2 个答案:

答案 0 :(得分:3)

你的问题是当你使用

Route::get('/{url}', 'MenuController@menu');
Route::get('/{name}', 'HomeSlideviewController@index')->name('promotiondetail');

您有相同的请求,因为{url}或{name}是可选参数,会发生的情况是它始终与第一种情况相匹配。最好的解决方案是使用这部分代码:

Route::get('/menu', 'MenuController@menu');
Route::get('/{name}', 'HomeSlideviewController@index')->name('promotiondetail');

你应该始终拥有最后只有可选参数的那个,否则它将始终首先执行,因为它将匹配。你应该记住的是,使用/{name}它会匹配任何东西,它就像一个变量,可以包含一个数字,也可以是一个字符串,例如一个url可能是domain/{anything}。如果您使用/name,则只有在您提出domain/name请求时才会匹配。

您可能需要阅读Laravel routing以获取有关路由的更多信息。

答案 1 :(得分:1)

你遇到的问题是两条路线基本相同,/ {something}。

你有几个解决方案 首先,整理你的路线,使它们略有不同,使它们彼此不匹配并纠正顺序 例如;

Route::get('/promo/{name}', 'HomeSlideviewController@index')->name('promotiondetail');
Route::get('/{url}', 'MenuController@menu')->name('menu');

另一个可能对您有用的解决方案是首先放置promotiondetail路由,并检查相同名称,如果没有,则重定向到另一个控制器。所以在HomeSlideviewController的索引函数中,尝试类似于;

public function index($name) {
    if ($name !== 'whatever you want it not to be') {
        return redirect()->route('menu);
    }
    // continue
}