【问题标题】:Getting route parameters in Lumen在 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 中运行良好。

【问题讨论】:

    标签: laravel laravel-routing lumen lumen-5.4 lumen-routing


    【解决方案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-&gt;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);
            }
        }
        
        

        【讨论】:

          猜你喜欢
          • 2018-02-10
          • 2016-10-11
          • 2019-09-15
          • 2016-12-28
          • 2020-02-09
          • 2016-10-30
          • 2019-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多