首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lumen中获取路由参数

在Lumen中获取路由参数
EN

Stack Overflow用户
提问于 2018-01-22 01:31:57
回答 3查看 10K关注 0票数 6

在最新版本的Lumen中尝试使用$request->route('id')访问路由参数时,我得到一个错误。

代码语言:javascript
复制
lumen.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: 
Call to a member function parameter() on array

它在Laravel中运行良好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-22 01:31:57

流明是如此精简,以至于Route解析为一个简单的数组,而不是一个Route对象。

这是一个问题,因为Request::route($key)方法假设路由将具有parameter方法。

但如果调用Request::route(null),将返回完整的路由数组,如下所示:

代码语言:javascript
复制
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]似乎始终包含路由参数。

我创建了一个简单的helper类来处理Lumen上的Route参数。您可以获取、设置和忘记路由参数。如果您需要在您的中间件中操作它们,这是非常有用的。

保存为app/Support/RouteParam.phphttps://gist.github.com/westphalen/c3cd187007e0448bcb7fca1de091e4df

简单地像这样使用它:$id = RouteParam::get($request, 'id');

责怪illuminate/http/Request.php

代码语言:javascript
复制
/**
 * 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.
}
票数 13
EN

Stack Overflow用户

发布于 2021-04-30 01:54:19

问题是Lumen只是还没有在全局中间件中注册路由信息。

因此,如果调用$request->route(),您只会得到空字符串

代码语言:javascript
复制
class MyMiddleware {
    public function handle($request, Closure $next)
    {
        $request->route(); // empty string or null
        return $next($request);
    }
}

决定是将您的中间件定义为路由中间件,并手动将其设置为每个所需的路由。bootstrap/app.php

代码语言:javascript
复制
$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';
});

最终正确的中间件:

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-08-24 04:49:16

我不确定您试图从哪里访问它,但是如果它来自控制器,Lumen文档解释说它是通过在方法中输入提示来访问的:https://lumen.laravel.com/docs/master/requests#accessing-the-request

从文档中:

您仍然可以通过如下所示定义您的控制器方法,以提示输入Illuminate\Http\请求并访问您的路由参数id:

代码语言:javascript
复制
<?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)
    {
        //
    }
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48369687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档