Ошибка обработки Laravel, которая выдается только контроллером - PullRequest
1 голос
/ 26 марта 2019

Я создаю логику, в которой контроллер может вызывать другой контроллер в зависимости от роли 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 - нет, а если пользователь вошел в систему как гуру и пытается вызвать метод A (), он должен вернутьне найдено исключение или что-то понятное пользователю сообщение, но в настоящее время показывающий метод BadMethodCallException A () не существует

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

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

0 голосов
/ 26 марта 2019

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

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.

Что ты думаешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...