我認爲處理常規請求(通過基於會話的認證)的控制器應該與api控制器(基於令牌的認證)分開。因此,每個控制器都會對功能的一部分負責。另外,api控制器中的更改不會在會話控制器中產生副作用。因此,您可以在每個控制器中明確指定auth guard。 Laravel需要明確指定警戒,否則將使用默認警衛。沒有辦法讓人聰明地猜測自己使用什麼警衛。當然,你可以做這樣的事情:
public function action(Request $request)
{
$guard = $request->has('api_token') ? 'api' : 'session';
$authUser = Auth::guard($guard)->user();
//your code next
}
如果你將使用單獨的控制器,你可以將常用的功能概括到父抽象控制器。請注意,在下面的示例中,ChildControllers僅通過名稱空間不同。 父級:
<?php
namespace App\Http\Controllers\Api
use App\Http\Controllers\Controller;
abstract class ParentController extends Controller
{
public function action(Request $request)
{
$authUser = Auth::guard($this->guard)->user();
//your code...
}
}
API控制器:
<?php
namespace App\Http\Controllers\Session
use App\Http\Controllers\ParentController
class ChildController extends ParentController
{
protected $guard = 'session';
//your code...
}
會話控制器:
<?php
namespace App\Http\Controllers\Api
use App\Http\Controllers\ParentController
class ChildController extends ParentController
{
protected $guard = 'api';
//your code...
}