Похоже, невозможно redirect()
напрямую из пользовательского класса ValidateRequest
. Единственное решение, которое я нашел, - это создать собственное исключение и обработать его в классе Handler. Итак, теперь он работает со следующим кодом:
Обновление: метод redirectTo()
был обновлен, чтобы решение работало на Laravel 6.x и выше.
приложение/запросы/ValidateRequest.php
class ValidateRequest extends Request{
public function authorize(){
// some logic here...
return false;
}
public function rules(){
return [];
}
public function failedAuthorization() {
$exception = new NotAuthorizedException('This action is unauthorized.', 403);
throw $exception->redirectTo("safepage");
}
}
приложение/Exceptions/NotAuthorizedException.php
<?php
namespace App\Exceptions;
use Exception;
class NotAuthorizedException extends Exception
{
protected $route;
public function redirectTo($route) {
$this->route = $route;
abort(Redirect::to($route));
}
public function route() {
return $this->route;
}
}
и app/Exceptions/Handler.php
...
public function render($request, Exception $exception){
...
if($exception instanceof NotAuthorizedException){
return redirect($exception->route());
}
...
}
Итак, это работает, но намного медленнее, чем я ожидал... Простое измерение показывает, что обработка и перенаправление занимают 2,1 с, но с Laravel 5.1 то же самое действие (и тот же код) занимает всего 0,3 с.
Добавление NotAuthorizedException::class
к свойству $dontReport
вообще не помогает...
Обновить
Он работает намного быстрее с php 7.2, занимает 0,7 с.
person
lubart
schedule
21.03.2018