Как принудительно перенаправить Laravel 5.6 из объекта RedirectResponse? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть собственный не-Eloquent класс, который называется Item.В конструкторе Item пытается аутентифицироваться с моим приложением.Затем у меня есть метод Auth(), чтобы проверить, прошла ли аутентификация успешно, и если не запускать перенаправление.

public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } else {
        return redirect('/auth');
    }
}

Я использую метод Auth для статического доступа к Item через Item Фасад.Предполагаемый результат состоит в том, что если элемент аутентифицирован, мы переходим к индексу с этим элементом в качестве переменной.В противном случае перенаправление будет инициировано.

public function index() {
    $item = Item::Auth();
    return view('index',$item);
}

Однако, если не аутентифицировано, все, что происходит, - это объект Laravel RedirectResponse, который передается в представление индекса.Как я могу заставить это перенаправление фактически запустить?

Решения, о которых я думал, но не люблю

if ($item instanceOf RedirectResponse)... в контроллере, но это кажется неуклюжим

$item = new Item; if ($item->authenticated)... это нормально для контроллера, но я хочу вызвать перенаправление из нескольких частей приложения, чтобы было много повторного использования кода, который не был бы эффективен.

Спасибо за любую помощь.Либо на фасаде, либо на объекте Redirect.

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете обработать этот случай, используя AuthenticationException:

public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } 
    throw new AuthenticationException();
}

Исключение аутентификации приведет к перенаправлению на вход в систему или ошибке 401 на маршрутах JSON.Конечно, вы можете выдать другое исключение и обработать его как перенаправление в вашем App\Exceptions\Handler классе

Например:

public function Auth() {
    if (isset($this->authenticated)) {
        return $this;
    } 
    throw new ItemNotAuthorizedException(); //Custom class you need to create
}

В Handler.php:

 public function render($request, Exception $exception)
 {
    if ($exception instanceof ItemNotAuthorizedException) {
       return redirect("/auth");
    }
    return parent::render($request, $exception);
 }

Примечание: Laravel 5.6 может также разрешать исключениям реализовывать свою собственную функцию рендеринга, но вы должны обратиться к документации для этого.

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