我开始使用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()
)的响应。我精确地指出,如果删除第二条路由声明,则中间件中的该声明将按预期工作。
有人知道我如何实现类似的工作吗?
路由器将检查您的请求是否与任何声明的路线匹配。中间件将在匹配后运行,因此您不能仅返回路由器并尝试找到另一个匹配。
放弃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 {
//
}
}
此模式与Laravel的路由想法相反。每个路线应定义一次。
您可以在未启用auth
中间件的情况下定义路由,然后在控制器中定义逻辑。