Laravel обрабатывает ошибку, которая выдается только контроллером

#laravel #laravel-5 #laravel-5.8

#laravel #laravel-5 #laravel-5.8

Вопрос:

Я создаю логику, в которой контроллер может вызывать другой контроллер в зависимости от роли Auth:: user (), но не все контроллеры используют один и тот же метод, поэтому я хочу, чтобы, если контроллер вызывает метод, который не существует, он выдаст 404 not found. вот мой контроллер

 class LokalController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return IlluminateHttpResponse
     */
    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 SIAHttpControllersAdminLokalController;
                break;
            case 'guru':
                $this->controller = new SIAHttpControllersGuruLokalController;
                break;
            case 'siswa':
                $this->controller = new SIAHttpControllersGuruLokalController;
                break;

        }
    }
    public function index()
    {
        return $this->controller->index();
    }
  

например, у Admin LokalController есть метод A(), а у Guru LokalController его нет, и если пользователь вошел в систему как guru и пытается вызвать метод A (), он должен возвращать не найденное исключение или что-то понятное пользователю сообщение, но в настоящее время показывает, что метод A BADMETHOD callexception () не существует

Ответ №1:

Подход, который вы пытаетесь использовать, достижим, но я думаю, что со временем это будет непосильным.

 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 .

Что вы думаете?

Комментарии:

1. Поскольку я не хочу менять маршрут, и другая роль может получить доступ к sam URL, я думаю, будет лучше, если мы обработаем все внутри контроллера без перенаправления.

2. Кстати, ваше решение по-прежнему возвращает исключение BADMETHOD Callexception

Ответ №2:

Одним из вариантов является наличие контроллера, от которого наследуются все эти контроллеры, который реализует все методы, вызывая 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, контроллер администратора не получит