Laravel 处理仅由控制器抛出的错误
Laravel handle error that only thrown by controller
我正在创建一个逻辑,其中一个控制器可以根据 Auth::user() 角色调用另一个控制器,但并非所有控制器都共享相同的方法,所以我想如果控制器调用一个不存在的方法将抛出 404 未找到。
这是我的控制器
class LokalController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
Public $controller;
public function __construct()
{
//$this->middleware('adminakses');
$this->middleware(function ($request, $next) {
$this->setController();
return $next($request);
});
}
public function setController()
{
$role = Auth::user()->role;
switch ($role)
{
case 'admin':
$this->controller = new \SIA\Http\Controllers\Admin\LokalController;
break;
case 'guru':
$this->controller = new \SIA\Http\Controllers\Guru\LokalController;
break;
case 'siswa':
$this->controller = new \SIA\Http\Controllers\Guru\LokalController;
break;
}
}
public function index()
{
return $this->controller->index();
}
例如 Admin\LokalController 有方法 A(),但 Guru\LokalController 没有,如果用户以 guru 身份登录并尝试调用方法 A(),它应该返回未找到的异常或一些用户可以理解的消息,但当前显示 BadMethodCallException 方法 A() 不存在
您尝试采用的方法是可以实现的,但我认为它会及时完成。
public function index()
{
try {
$action = $this->controller . '@' . __FUNCTION__;
action($action);
} catch (Exception $e) {
abort('401', "Your Message");
}
}
我的做法是,我会为用户模型创建一个重定向路径。
public function getRedirectPathAttribute() {
switch ($this->role) {
case 'admin':
return '/admin';
case 'guru':
return '/guru';
case 'siswa':
return '/siswa';
}
}
然后创建一个中间件来进行检查,如果需要重定向,我会使用 auth()->user()->redirect_path
重定向。
你怎么看?
一个选项是让一个控制器继承自该控制器,通过调用 App::abort(404) 实现所有方法,并在每个子 类 中实现它们需要的方法,停止父 类 中的方法被调用
class BaseController extends Controller{
public function a() {
App::abort(404);
}
}
class AdminController extends BaseController{
public function a() {
// to stuff for admin
}
}
继承自 BaseController 且未实现 a() 的控制器将获得 404,管理控制器则不会
我正在创建一个逻辑,其中一个控制器可以根据 Auth::user() 角色调用另一个控制器,但并非所有控制器都共享相同的方法,所以我想如果控制器调用一个不存在的方法将抛出 404 未找到。 这是我的控制器
class LokalController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
Public $controller;
public function __construct()
{
//$this->middleware('adminakses');
$this->middleware(function ($request, $next) {
$this->setController();
return $next($request);
});
}
public function setController()
{
$role = Auth::user()->role;
switch ($role)
{
case 'admin':
$this->controller = new \SIA\Http\Controllers\Admin\LokalController;
break;
case 'guru':
$this->controller = new \SIA\Http\Controllers\Guru\LokalController;
break;
case 'siswa':
$this->controller = new \SIA\Http\Controllers\Guru\LokalController;
break;
}
}
public function index()
{
return $this->controller->index();
}
例如 Admin\LokalController 有方法 A(),但 Guru\LokalController 没有,如果用户以 guru 身份登录并尝试调用方法 A(),它应该返回未找到的异常或一些用户可以理解的消息,但当前显示 BadMethodCallException 方法 A() 不存在
您尝试采用的方法是可以实现的,但我认为它会及时完成。
public function index()
{
try {
$action = $this->controller . '@' . __FUNCTION__;
action($action);
} catch (Exception $e) {
abort('401', "Your Message");
}
}
我的做法是,我会为用户模型创建一个重定向路径。
public function getRedirectPathAttribute() {
switch ($this->role) {
case 'admin':
return '/admin';
case 'guru':
return '/guru';
case 'siswa':
return '/siswa';
}
}
然后创建一个中间件来进行检查,如果需要重定向,我会使用 auth()->user()->redirect_path
重定向。
你怎么看?
一个选项是让一个控制器继承自该控制器,通过调用 App::abort(404) 实现所有方法,并在每个子 类 中实现它们需要的方法,停止父 类 中的方法被调用
class BaseController extends Controller{
public function a() {
App::abort(404);
}
}
class AdminController extends BaseController{
public function a() {
// to stuff for admin
}
}
继承自 BaseController 且未实现 a() 的控制器将获得 404,管理控制器则不会