В Laravel < 5.5
я могу изменить это app/Exceptions/Handler
файлов app/Exceptions/Handler
чтобы изменить URL-адрес перенаправления переназначенного пользователя:
protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest(route('login')); }
Но в Laravel 5.5
это было перемещено в это место vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
так как я могу изменить его сейчас? Я не хочу менять материал в каталоге поставщика, чтобы он был переопределен обновлениями композитора.
protected function unauthenticated($request, AuthenticationException $exception) { return $request->expectsJson() ? response()->json(['message' => 'Unauthenticated.'], 401) : redirect()->guest(route('login')); }
Но в Laravel 5.5 это было перемещено в это место vendor / laravel / framework / src / Illuminate / Foundation / Exceptions / Handler.php, так как я могу изменить его сейчас? Я не хочу менять материал в каталоге поставщика, чтобы он был переопределен обновлениями композитора.
Это просто случай, когда функция по умолчанию не существует.
Вы можете просто переопределить его, как это было в 5.4. Просто включите
use Exception; use Request; use Illuminate\Auth\AuthenticationException; use Response;
в файле обработчика.
Например, мое app/Exceptions/Handler.php
выглядит примерно так:
<?php namespace App\Exceptions; use Exception; use Request; use Illuminate\Auth\AuthenticationException; use Response; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { (...) // The dfault file content /** * Convert an authentication exception into a response. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Auth\AuthenticationException $exception * @return \Illuminate\Http\Response */ protected function unauthenticated($request, AuthenticationException $exception) { return $request->expectsJson() ? response()->json(['message' => 'Unauthenticated.'], 401) : redirect()->guest(route('authentication.index')); } }
Вот как я это решил. В функции render я поймал класс исключения. И в случае, если это класс исключительной проверки подлинности, я написал свой код для перенаправления (код, который я бы написал в не прошедшей проверку в предыдущей версии функции).
public function render($request, Exception $exception) { $class = get_class($exception); switch($class) { case 'Illuminate\Auth\AuthenticationException': $guard = array_get($exception->guards(), 0); switch ($guard) { case 'admin': $login = 'admin.login'; break; default: $login = 'login'; break; } return redirect()->route($login); } return parent::render($request, $exception); }
Но в Laravel 5.5 это было перемещено в это место vendor / laravel / framework / src / Illuminate / Foundation / Exceptions / Handler.php, так как я могу изменить его сейчас? Я не хочу менять материал в каталоге поставщика, чтобы он был переопределен обновлениями композитора.
Нам нужно просто включить использование Illuminate \ Auth \ AuthenticationException;
а затем он работает как в laravel 5.4
1.Go к vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
файл.
2.Поиск имени метода не проверено.
3. И измените URL-адрес перенаправления из redirect()->guest(route('login'))
для redirect()->guest(route('api/login')) //whatever you want
.
Вы можете вернуть ответ как JSON, если это API-сервисы.