两次声明相同的路由,但根据中间件期望有不同的行为

问题描述 投票:0回答:2

我开始使用lumen框架创建REST API,并希望为GET /user路由设置特定的行为。行为如下:

  • 如果请求来自经过身份验证的用户(使用auth中间件),则调用getAllFields中的方法UserController并从user中返回所有数据
  • 如果不是这种情况,则调用get中的方法UserController并从user中返回一些数据

在我看来,使用简单的中间件像这样在web.php中编写类似的逻辑:

<?php

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->get('/user/{id}',  [
        'uses' => 'UserController@getAllFields'
    ]);
});

$router->get('/user/{id}',  [
    'uses' => 'UserController@get'
]);

但是由于某种原因,即使中间件正确,我也总是得到第二个路由声明(调用get())的响应。我精确地指出,如果删除第二条路由声明,则中间件中的该声明将按预期工作。

有人知道我如何实现类似的工作吗?

php laravel lumen
2个回答
2
投票

路由器将检查您的请求是否与任何声明的路线匹配。中间件将在匹配后运行,因此您不能仅返回路由器并尝试找到另一个匹配。

放弃Laravel和Routes模式-您应该具有单个路由,该路由将指向例如控制器内部的get()方法。然后在其中可以检查用户是否已登录并从该控制器执行getAllFields()。由于您当前在两条路由中都使用UserController,因此重写不会太多。

web.php

$router->get('/user/{id}', 'UserController@get');

UserController.php

public function get()
{
   return auth()->check() ? YourMethodForLogged() : YourMethodForNotLogged();
}

或者如果逻辑不多,您可以将其保留在单个方法中。放弃Laravels REST标准也是一个好主意(因此请使用show而不是get)

web.php

$router->get('/users/{user}', 'UserController@show');

UserController.php

public function show(User $user)
{
   if (auth()->check()) {
      //
   } else {
      //
   }
}

0
投票

此模式与Laravel的路由想法相反。每个路线应定义一次。

您可以在未启用auth中间件的情况下定义路由,然后在控制器中定义逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.