如何使用一个 Laravel 控制器和多个 Guard 而不是复制控制器
How to use One Laravel Controller with Multiple Guard instead of Duplicating the Controller
我有两个守卫
Admin
User
我还创建了控制器,用户可以在其中管理自己的数据,管理员也可以管理用户数据。所以我创建了两个控制器
Controllers
Admin
EducatonBackgroundController
User
EducationBackgroundController
在User/EducationBackgroundController中,我有这个功能可以获取当前登录用户的教育背景并显示在用户视图中
public function index(Education $education)
{
try {
$educations = $education->where('user_id',$this->userLoggedID())->with('organization','program','country','city')->get();
return view('users.education.index',compact('educations'));
}
catch (Exception $e) {
abort(404);
}
}
在Admin/EducationBackgroundController中,我有这个功能可以获取所有用户的教育背景并显示在管理视图中
public function index(Education $education)
{
try {
$educations = $education->with('organization','program','country','city','user')->get();
return view('admin.users.education.index',compact('educations'));
}
catch (Exception $e) {
abort(404);
}
}
根据观察,这些函数相似,但在视图 return 和数据获取方面有所不同。
那么我如何创建一个管理员和用户守卫都可以使用的控制器,而不是为两个守卫复制控制器和视图。
我通过添加第二组路由做了类似的事情,如下所示:
<?php
Route::middleware(['auth:admin_api'])->group(function () {
Route::prefix('admin')->group(function () {
Route::name('api.admin.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE ADMIN API ROUTES HERE ////////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test','App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
});
Route::middleware(['auth:api'])->group(function () {
Route::name('api.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE PUBLIC API ROUTES HERE ///////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test', 'App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
因此,当管理员用户进入 admin/test 时,它使用管理员身份验证守卫,而当普通用户进入 /test 时,它使用标准身份验证守卫。这两个都使用相同的控制器。
然后我为我的应用程序创建了一个基本控制器。以下是我如何确定使用 guard 来访问构造函数中的路由:
<?php
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
class BaseController extends Controller
{
protected $user;
protected $isAdmin = false;
public function __construct()
{
if(Auth::guard('admin_api')->check()) {
$this->user = Auth::guard('admin_api')->user();
$this->isAdmin = true;
} elseif(Auth::guard('api')->check()) {
$this->user = Auth::guard('api')->user();
$this->isAdmin = false;
} else {
return response()->json([
'message' => 'Not Authorized',
], 401);
}
}
我有两个守卫
Admin
User
我还创建了控制器,用户可以在其中管理自己的数据,管理员也可以管理用户数据。所以我创建了两个控制器
Controllers
Admin
EducatonBackgroundController
User
EducationBackgroundController
在User/EducationBackgroundController中,我有这个功能可以获取当前登录用户的教育背景并显示在用户视图中
public function index(Education $education)
{
try {
$educations = $education->where('user_id',$this->userLoggedID())->with('organization','program','country','city')->get();
return view('users.education.index',compact('educations'));
}
catch (Exception $e) {
abort(404);
}
}
在Admin/EducationBackgroundController中,我有这个功能可以获取所有用户的教育背景并显示在管理视图中
public function index(Education $education)
{
try {
$educations = $education->with('organization','program','country','city','user')->get();
return view('admin.users.education.index',compact('educations'));
}
catch (Exception $e) {
abort(404);
}
}
根据观察,这些函数相似,但在视图 return 和数据获取方面有所不同。
那么我如何创建一个管理员和用户守卫都可以使用的控制器,而不是为两个守卫复制控制器和视图。
我通过添加第二组路由做了类似的事情,如下所示:
<?php
Route::middleware(['auth:admin_api'])->group(function () {
Route::prefix('admin')->group(function () {
Route::name('api.admin.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE ADMIN API ROUTES HERE ////////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test','App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
});
Route::middleware(['auth:api'])->group(function () {
Route::name('api.')->group(function () {
////////////////////////////////////////////////////////////
/// PLACE PUBLIC API ROUTES HERE ///////////////////////////
////////////////////////////////////////////////////////////
Route::apiResource('test', 'App\Http\Controllers\API\MyController');
////////////////////////////////////////////////////////////
});
});
因此,当管理员用户进入 admin/test 时,它使用管理员身份验证守卫,而当普通用户进入 /test 时,它使用标准身份验证守卫。这两个都使用相同的控制器。
然后我为我的应用程序创建了一个基本控制器。以下是我如何确定使用 guard 来访问构造函数中的路由:
<?php
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
class BaseController extends Controller
{
protected $user;
protected $isAdmin = false;
public function __construct()
{
if(Auth::guard('admin_api')->check()) {
$this->user = Auth::guard('admin_api')->user();
$this->isAdmin = true;
} elseif(Auth::guard('api')->check()) {
$this->user = Auth::guard('api')->user();
$this->isAdmin = false;
} else {
return response()->json([
'message' => 'Not Authorized',
], 401);
}
}