1

我正在创建一个控制器可以调用另一个控制器的逻辑取决于 Auth::user() 角色,但并非所有控制器都共享相同的方法,所以我希望如果控制器调用不存在的方法,它将抛出 404 not found . 这是我的控制器

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() 不存在

4

2 回答 2

0

您尝试采用的方法是可以实现的,但我认为它会及时压倒性的。

public function index()
{
    try { 
       $action = $this->controller . '@' . __FUNCTION__;
       action($action);
    } catch (Exception $e) {
        abort('401', "Your Message");
    }
}

我会怎么做,我会为 User 模型创建一个重定向路径。

public function getRedirectPathAttribute() {
    switch ($this->role) {
        case 'admin':
            return '/admin';
        case 'guru':
            return '/guru';
        case 'siswa':
            return '/siswa';
    }
}

然后创建一个中间件进行检查,如果需要重定向,我会使用auth()->user()->redirect_path.

你怎么看?

于 2019-03-26T02:44:52.637 回答
0

一种选择是拥有一个控制器,所有这些控制器都通过调用 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,管理控制器不会

于 2019-03-26T12:53:07.253 回答