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')));
您不需要在路由调用中指定键,数组根据它们在数组中的位置与给定路由中的参数配对,例如。数组中的第一项到路由中的第一个参数,数组中的第二项到路由中的第二个参数等
我有一个表单,用户可以在其中输入起始位置,提交时他将转到以该位置为中心的地图。他也可以直接跳过这一步,直接看地图。 (这是跳过整个背景故事的简化版本)
这是第一段代码,当用户使用表单时,它将从表单中获取起始位置并重定向到地图:(不要管规划变量,它将始终是 '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')));
您不需要在路由调用中指定键,数组根据它们在数组中的位置与给定路由中的参数配对,例如。数组中的第一项到路由中的第一个参数,数组中的第二项到路由中的第二个参数等