Получение параметров маршрута в Люмене

При попытке получить доступ к параметрам маршрута, используя $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');

https://lumen.laravel.com/docs/master/requests

Я не уверен, где вы пытаетесь получить к нему доступ, но если это с контроллера, документация 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)
    {
        //
    }
}
Другие вопросы по тегам