Laravel 5.5 изменить неаутентифицированный URL-адрес перенаправления входа

В Laravel < 5.5 я мог бы изменить этот файл 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'));
}

Ответы

Ответ 1

Но в 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'));
    }
}

Ответ 2

Но в Laravel 5.5 это перемещено в это место продавец/Laravel/рамки/SRC/Осветите/Foundation/исключения/handler.php так как я могу изменить его сейчас? Я не хочу менять вещи в поставщике directory encase, он становится переопределенным с помощью обновлений композитора.

Нам нужно просто включить используйте Illuminate\Auth\AuthenticationException;

а затем он работает как в laravel 5.4

Ответ 3

Вот как я это решил. В функции 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);
}

Ответ 4

Кроме overriding, вы можете напрямую вносить изменения в Handler.php в существующую функцию неаутентифицированной, расположенной в vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php, для перенаправления на предполагаемый маршрут на основе охранников.

/**
 * 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)
{


    $guard = array_get($exception->guards(),0);
    switch ($guard) {
        case 'admin':
            return $request->expectsJson()
                        ? response()->json(['message' => $exception->getMessage()], 401)
                        : redirect()->guest(route('admin.login'));
            break;

        default:
            return $request->expectsJson()
                        ? response()->json(['message' => $exception->getMessage()], 401)
                        : redirect()->guest(route('login'));
            break;
    }
}

Ответ 5

Просто добавьте маршрут для входа в файл маршрутов:

Route::get('/login', [
   'uses' => '[email protected]',
   'as' => 'login'
]);

Ответ 6

1. Вернитесь к файлу vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php.

2.Поиск имени метода unauthenticated.

3. И измените URL-адрес перенаправления с   redirect()->guest(route('login')) до redirect()->guest(route('api/login')) //whatever you want.

Вы можете вернуть ответ как JSON, если это API-сервисы.