【问题标题】:switch route in web.php laravel在 web.php laravel 中切换路由
【发布时间】:2017-11-02 20:41:41
【问题描述】:

我的 web.php 中有 2 条路线

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

提供网址:

  • /菜单

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

提供网址:

  • /menu(不同的页面,但在路线 1 中的名称相同)
  • /食物

如果路由 = 同名,我想使用 2 路由 如果路由 1 没有 url,我想使用路由 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');

当我去 /food 它会去页面找不到。

更新

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

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

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

更新 3

$url = 食物

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    你的问题是当你使用

    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 以了解有关路由的更多信息。

    【讨论】:

    • 好吧。,他们是没有办法使用 {url} , {name} 对吧?
    • 当您使用 {url} 和 {name} 时,它将始终匹配第一种情况,因为它们是可选的,例如 {url} 在 url 中覆盖任何单词或任何内容,您可以做的是使用“/url”,然后使用“/name”,或者如果你想传递一些可选参数,你应该使用“/name/{name}”和“/url/{url}”
    【解决方案2】:

    您遇到的问题是两条路线本质上是相同的,/{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
    }
    

    【讨论】:

    • 谢谢,我想我需要第二个,因为我不想使用 /promo/
    • 好吧,我试试第二个它说缺少必需的参数/{url}我如何通过路由传递参数
    • @test1321 当您重定向到promotiondetail 时,该行应为return redirect()->route('promotiondetail', ['name' => $url]);
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2021-02-03
    • 2017-04-27
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多