Laravel 显示参数名称而不是值(在路由中使用可选参数时)

Laravel shows parameter name instead of value (when using optional parameter in route)

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

这是第一段代码,当用户使用表单时,它将从表单中获取起始位置并重定向到地图:(不要管规划变量,它将始终是 'own' 就本案例而言)

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 KEY。)我在这里看到的是调试栏显示 '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 看看发生了什么。 假设用户输入 'Miami' 作为 startLocation 这将导致以下 URL:

http://laravel.dev/Map/startLocation?Miami => 调试栏会显示 'startLocation'

当我自己将URL修改为 http://laravel.dev/Map/Miami => 调试栏会显示 'Miami'

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

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

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

因此,您的 Route::get('Map/{startLocation?}', ...); 路由表示 startLocation 参数值是 Map/ 之后的任何内容。所以如果你去 Map/startLocation?Miami, startLocation 字符串作为参数的值。

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

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

您的路由调用有误

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

应该是这样的:

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

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