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
に移動されました。今すぐ変更するにはどうすればよいですか? composerの更新によって上書きされる場合を除き、ベンダーディレクトリの内容を変更したくありません。
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どうすれば変更できますか? composerの更新によって上書きされる場合を除き、ベンダーディレクトリの内容を変更したくありません。
関数がデフォルトでもう存在しないというだけです。
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'));
}
}
解決方法は次のとおりです。レンダリング関数で、例外クラスをキャッチしました。また、認証例外クラスの場合、リダイレクト用のコード(以前のバージョンでは認証されていない関数で記述するコード)を作成しました。
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どうすれば変更できますか? composerの更新によって上書きされる場合を除き、ベンダーディレクトリの内容を変更したくありません。
Use Illuminate\Auth\AuthenticationExceptionを含めるだけです。
laravel 5.4のように動作します
標準の例外ハンドラは名前付きルートを使用します。
そのため、その名前を使用するようにルートを定義するだけです。
したがって、routes/web.php
ファイルに次の行を追加するだけです。
Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');
name('login')
ビットはこのルートに名前を付けるため、認証されていない例外はこのルートを使用します。
独自の例外ハンドラを作成したり、標準の例外ハンドラを変更したりする必要はありません。
定型的な「auth」コードで使用される名前付きルートは、vendor/laravel/framework/src/Illuminate/Routing/Router.php
ファイルのauth()
関数にあります。 (ログイン、ログアウト、登録、password.request、password.email、password.reset)。これらのルートは、ルートファイルでRoute::auth();
行を使用すると追加されます。
Routesファイルにログイン用のルートを追加するだけです:
Route::get('/login', [
'uses' => 'UserController@getSignin',
'as' => 'login'
]);