在 Lumen 中获取路由参数
Posted
技术标签:
【中文标题】在 Lumen 中获取路由参数【英文标题】:Getting route parameters in Lumen 【发布时间】:2018-06-30 09:10:12 【问题描述】:在最新版本的 Lumen 中尝试使用 $request->route('id')
访问 Route 参数时,出现错误。
lumen.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError:
Call to a member function parameter() on array
它在 Laravel 中运行良好。
【问题讨论】:
【参考方案1】:Lumen 被如此精简,以至于 Route 解析为一个简单的数组,而不是一个 Route 对象。
这是一个问题,因为 Request::route($key)
方法假定 Route 将具有 parameter
方法。
但是如果你调用Request::route(null)
,就会返回完整的Route数组,看起来像这样:
array(3)
[0]=>
int(1)
[1]=>
array(2)
["uses"]=>
string(40) "App\Http\Controllers\SomeController@index"
["middleware"]=>
array(2)
[0]=>
string(4) "auth"
[1]=>
string(4) "example"
[2]=>
array(1)
["id"]=>
string(36) "32bd15fe-fec8-11e7-ac6b-e0accb7a6476"
[2]
似乎总是包含路由参数。
我创建了一个简单的辅助类来处理 Lumen 上的 Route 参数。您可以获取、设置和忘记路由参数。如果您需要在中间件中操作它们,这非常有用。
保存在app/Support/RouteParam.php
:https://gist.github.com/westphalen/c3cd187007e0448bcb7fca1de091e4df
然后像这样简单地使用它:$id = RouteParam::get($request, 'id');
责备illuminate/http/Request.php
:
/**
* Get the route handling the request.
*
* @param string|null $param
*
* @return \Illuminate\Routing\Route|object|string
*/
public function route($param = null)
$route = call_user_func($this->getRouteResolver());
if (is_null($route) || is_null($param))
return $route;
return $route->parameter($param); // can't call parameter on array.
【讨论】:
【参考方案2】:我不确定您尝试在哪里访问它,但如果它来自控制器,Lumen 文档解释说它是通过在方法中类型提示来访问的:https://lumen.laravel.com/docs/master/requests#accessing-the-request
来自文档:
您仍然可以键入提示 Illuminate\Http\Request 并通过定义控制器方法来访问您的路由参数 id,如下所示:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
/**
* Update the specified user.
*
* @param Request $request
* @param string $id
* @return Response
*/
public function update(Request $request, $id)
//
【讨论】:
【参考方案3】:问题是 Lumen 还没有在 global 中间件中注册路由信息。
所以,如果你调用$request->route()
,你只会得到空字符串:
class MyMiddleware
public function handle($request, Closure $next)
$request->route(); // empty string or null
return $next($request);
决定将您的中间件定义为路由中间件,并手动将其设置为每个需要的路由。
bootstrap/app.php
:
$app->middleware([
// MyMiddleware::class, // do not use global middleware
]);
$app->routeMiddleware([
MyMiddleware::class,
]);
// And then apply the middleware to every route using a group:
$app->router->group([
'namespace' => 'App\Http\Controllers',
'middleware' => [MyMiddleware::class],
], function ($router)
require __DIR__ . '/../routes/web.php';
);
最终正确的中间件:
class MyMiddleware
public function handle($request, Closure $next)
// @see https://github.com/laravel/lumen-framework/issues/119#issuecomment-298835011
$route = $request->route();
$routeParameters = is_array($route) ? $route[2] : $route->parameters();
return $next($request);
【讨论】:
以上是关于在 Lumen 中获取路由参数的主要内容,如果未能解决你的问题,请参考以下文章