Получение параметров маршрута в Люмене
При попытке получить доступ к параметрам маршрута, используя $request->route('id')
, в последней версии Lumen, я получаю ошибку.
lumen.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError:
Call to a member function parameter() on array
Он отлично работает в Laravel.
4 ответа
Lumen настолько урезан, что маршрут разрешается в простой массив, а не в объект Route.
Это проблема, так как Request::route($key)
метод предполагает, что у маршрута будет 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]
кажется, всегда содержит параметры маршрута.
Я сделал простой вспомогательный класс для работы с параметрами Route в Lumen. Вы можете получить, установить и забыть параметры маршрута. Это прекрасно работает, если вам нужно манипулировать ими в промежуточном программном обеспечении.
Сохранить в 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.
}
Проблема в том, что Lumen просто еще не регистрирует информацию о маршруте в глобальном промежуточном программном обеспечении.
Итак, вы просто получите пустую строку, если вызовете
$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, независимо от того, что глагол HTTP:
$name = $request->input('name');
Я не уверен, где вы пытаетесь получить к нему доступ, но если это с контроллера, документация Lumen объясняет, что доступ к нему осуществляется путем ввода подсказок в методе: https://lumen.laravel.com/docs/master/requests
Из документации:
Вы по-прежнему можете ввести Illuminate\Http\Request и получить доступ к своему идентификатору параметра маршрута, определив свой метод контроллера следующим образом:
<?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)
{
//
}
}