【问题标题】:Laravel shows parameter name instead of value (when using optional parameter in route)Laravel 显示参数名称而不是值(在路由中使用可选参数时)
【发布时间】:2017-02-03 19:43:54
【问题描述】:

我有一个表单,用户可以在其中输入起始位置,提交时他将转到以该位置为中心的地图。他也可以跳过这一步,直接进入地图。 (这是跳过整个背景故事的简化版本)

这是第一段代码,当用户使用表单时,它将从表单中获取起始位置并重定向到地图:(不要介意计划变量,它始终是“自己的”)本例)

Route::post('InitiateUserTrip', ['as' => 'InitiateUserTrip', function(WelcomeFormRequest $request) 
{
    if (Input::get('planning') == 'own') {
        return Redirect::route('Map',array('startLocation', Input::get('startLocation')));
    } else {
      return view('welcome');
    }
} ]);

这是地图路线,startLocation 是可选的,如上所述。 (API 密钥将是我的个人 API 密钥。)我在这里看到的是调试栏显示的是“startLocation”而不是参数的值。 (名称而不是值)

Route::get('Map/{startLocation?}', ['as' => 'Map', function($startLocation = null)
{
    $map = new Map('API KEY',$startLocation,'GMainMap');    
    $googleMap = $map->getMap();
    $node = new Node();
    $node->loadBySelection('ALL');
    $nodes = $node->getNodes();
    \Debugbar::info("Map: " . $startLocation);
    return View::make('map')->with('map', $googleMap)
                            ->with('nodes',$nodes)
                            ->with('startLocation',$startLocation);
}]);

我开始使用 URL 来查看发生了什么。 假设用户输入“迈阿密”作为 startLocation,这将导致以下 URL:

http://laravel.dev/Map/startLocation?Miami => 调试栏将显示“startLocation”

当我自己修改网址时 http://laravel.dev/Map/Miami => 调试栏将显示“迈阿密”

不只是 Debugbar 会显示错误的内容。我尝试基于此变量进行地理编码,但它失败了,因为它也将内容视为“startLocation”。

我也许可以通过创建两条路线来解决这个问题,一条带参数,一条不带参数,但我想我只是遗漏了一些明显的东西。

【问题讨论】:

  • 你为什么使用“?”在路线中,删除这个
  • @ImtiazPabel ? 表示路由参数是可选的并且完全有效。
  • 必须记住,路由参数与GET 参数不同(来自URL 中? 后面的查询字符串)。 /Map/Miami 将正确地为$startLocation 返回"Miami",就像/Map/startloaction?Miami正确$startLocation 显示"startLocation"。当您真的应该只选择一个时,您几乎尝试同时使用 URL 和 GET 参数。
  • 有人能解释一下为什么这个问题被否决了吗?也许这是一个新手问题,但我正在努力学习,我认为每个人有时都会犯愚蠢的错误。我也尽力提出一个清晰的问题,清楚地描述环境、情况和问题。所以请在这里帮助我,只是通过否决这个问题,我不会学习如何为未来改进我的帖子。 (我已经看过“如何提问”)

标签: php google-maps laravel routing laravel-5.1


【解决方案1】:

您的路线按预期工作。请记住,{startLocation?} 不是 URL 的一部分,而是一个占位符,将被参数的实际值替换

因此,您的 Route::get('Map/{startLocation?}', ...); 路线表示 startLocation 参数值是紧随其后的任何值地图/。所以如果你去Map/startLocation?MiamistartLocation字符串作为参数的值。

同时提供 /Map/Map/startLocation?Miami 网址的最简单方法是定义 2 条路线:

Route::get('Map', ...);
Route::get('Map/startLocation?{startLocation}', ...);

【讨论】:

    【解决方案2】:

    您的路由调用中有错误

    Redirect::route('Map',array('startLocation', Input::get('startLocation')));
    

    应该是这样的:

    Redirect::route('Map',array(Input::get('startLocation')));
    

    您不需要在路由调用中指定键,数组根据它们在数组中的位置与给定路由中的参数配对,例如。数组中的第一项到路由中的第一个参数,数组中的第二项到路由中的第二个参数等。

    【讨论】:

    • 只是为了更清楚一点,使用键是可以的,但尝试的方式仍然是错误的。 array('startLocation' => Input::get('startLocation'))
    • 我原本想建议这个,但我的解决方案需要更少的代码 :) 当然两者都是正确的。
    猜你喜欢
    • 2019-10-15
    • 2015-03-06
    • 2015-02-05
    • 1970-01-01
    • 2023-04-01
    • 2021-05-11
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多