我需要创建一个用户认证控制器。用户可以分为两种类型:买家和卖家。我希望根据用户类型在同一地址 /accreditations/create 调用不同的控制器。 现在我做到了。
Route web.php
Route::middleware('auth')->group(function () {
Route::resource('accreditations', AccreditationController::class);
});
在AccreditationController的Create方法中
public function create()
{
$user = auth()->user();
$controllerName = $this->getControllerName($user->role);
$controller = app()->make($controllerName);
return $controller->callAction('create', []);
}
protected function getControllerName($id){
return match ($id) {
Roles::TRADER=> TraderController::class,
Roles::BUYER => BuyerController::class,
};
}
因此,在每个控制器中我创建了一个调用其自己的 View 的 Create 方法
class TraderController extends Controller
{
public function create()
{
$user = auth()->user();
return View('Accreditations/CreateTrader', compact('user'));
}
}
我做的是正确的事情还是有更好的方法来解决这个问题?
所以您的情况是:您有 2 个角色(买方和卖方),并且您希望您的行动取决于角色?
也许只需要 1 个控制器和 if 条件。 所以你的控制器将是这样的:
public function create(){
if(role=="buyer"){
//code for buyer
}
else{
//code for seller
}
}
改变@Herry的答案,你可以做
public function create(Request $request){
if(role=="buyer"){
return $this->createBuyer($request);
} else if(role=="seller"){
return $this->createSeller($request);
} else{
return $this->createDefault($request);
}
}
public function createBuyer($request) {
}
public function createSeller($request) {
}
public function createDefault($request) {
}
您有单点入口方法
create
,然后根据角色返回方法。