Php 是否可以在Laravel的同一控制器上同时使用auth和auth:api中间件?

Php 是否可以在Laravel的同一控制器上同时使用auth和auth:api中间件?,php,laravel,laravel-passport,Php,Laravel,Laravel Passport,我得到了使用LaravelPassport(用于OAUTH2支持)为移动设备实现API的任务。我想重用我在网站上使用的相同控制器方法(其中一些)。我尝试过这样做: public function __construct() { $this->middleware('auth'); $this->middleware('auth:api'); } 但这不起作用(为什么?)。我是否需要为api创建新的控制器?谢谢 在路由文件中,您可以通过执行以下操作指定多个中间件 Ro

我得到了使用LaravelPassport(用于OAUTH2支持)为移动设备实现API的任务。我想重用我在网站上使用的相同控制器方法(其中一些)。我尝试过这样做:

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('auth:api');
}

但这不起作用(为什么?)。我是否需要为api创建新的控制器?谢谢

在路由文件中,您可以通过执行以下操作指定多个中间件

Route::middleware(['auth:api', 'auth'])->group(function() {
    //my routes
});
但是对于您的使用,您可以在api路由文件中使用
auth:api
,在web路由文件中使用
auth

此外,如果您希望在不通过路由分组的情况下对整个控制器进行中间件化,则可以使用中间件组

在Http
Kernel.php
中,向数组添加一个新索引
$middlewareGroups

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],

    'both' => [
        'auth:api',
        'auth'
    ],
];
然后在控制器中,您应该能够执行以下操作:

public function __construct() {
    $this->middleware('both');
}
此外,您可以从中间件组中排除控制器中的方法

public function __construct() {
    $this->middleware('both', ['except' => [ 'methodOne', 'methodTwo' ]]);
}

如果您想让两个不同的身份验证卫士检查一个用户,可以使用
Auth
中间件。它采用的参数数量未指定:

auth:web,api
这将检查每个用户的防护,直到返回一个,然后将其用作请求的当前防护

您拥有的是在堆栈中运行的两个不同的中间件。因为只有其中一个会通过,所以您的设置总是“未经验证”。(除非您有一个会话并且出于某种奇怪的原因正在传递令牌)


我想在我的构造函数中这样做,这可能吗?我尝试了
$this->中间件(['auth','auth:api])但这不起作用。将它放在控制器中意味着用户必须登录到您的网站,同时拥有访问令牌(这将破坏您的移动API)。Luminosity的答案是,只需拥有不同的路由集(即web和api)并在该级别应用中间件,这是最有意义的,并且允许您在不需要所有额外代码的情况下重用控制器。