Dans Laravel < 5.5
Je pourrais changer ce fichier app/Exceptions/Handler
pour changer l’URL de redirection d’utilisateur non authentifié:
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('login'));
}
Mais en Laravel 5.5
ceci a été déplacé à cet endroit vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php
alors comment puis-je le changer maintenant? Je ne veux pas modifier les éléments du répertoire des fournisseurs, ils sont remplacés par composer mises à jour.
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => 'Unauthenticated.'], 401)
: redirect()->guest(route('login'));
}
Mais dans Laravel 5.5 cela a été déplacé dans cet emplacement vendeur/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php alors comment puis-je le changer maintenant? Je ne veux pas pour changer des éléments dans le répertoire des fournisseurs, ils sont remplacés par composer est mis à jour.
C'est juste le cas que la fonction n'est plus là par défaut.
Vous pouvez simplement le remplacer comme vous l'avez fait en 5.4. Assurez-vous simplement d'inclure
use Exception;
use Request;
use Illuminate\Auth\AuthenticationException;
use Response;
dans le fichier Handler.
Par exemple mon app/Exceptions/Handler.php
ressemble un peu à ceci:
<?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'));
}
}
Voici comment je l'ai résolu. Dans la fonction de rendu, j'ai attrapé la classe d'exception. Et au cas où il s'agisse d'une classe d'exception d'authentification, j'ai écrit mon code pour la redirection (le code que j'écrirais dans une fonction non authentifiée de la version précédente).
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);
}
Mais dans Laravel 5.5 cela a été déplacé dans cet emplacement vendeur/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php alors comment puis-je le changer maintenant? Je ne veux pas pour changer des éléments dans le répertoire des fournisseurs, ils sont remplacés par composer est mis à jour.
Nous devons simplement inclure l'utilisation Illuminate\Auth\AuthenticationException;
et puis cela fonctionne comme dans laravel 5.4
Le gestionnaire d'exceptions standard utilise un itinéraire nommé.
Donc, vous venez de définir votre itinéraire pour utiliser ce nom.
Donc, dans votre fichier routes/web.php
, Ajoutez simplement la ligne:
Route::get('mylogin', 'MyLoginController@showLoginForm')->name('login');
Le bit name('login')
donne un nom à cette route; ainsi, l'exception non authentifiée utilisera cette route.
Vous n'avez pas besoin de vous soucier de créer votre propre gestionnaire d'exceptions ou de modifier le gestionnaire d'exceptions standard.
Les itinéraires nommés utilisés par le code d'exécution 'auth' se trouvent dans le fichier vendor/laravel/framework/src/Illuminate/Routing/Router.php
, Dans la fonction auth()
. (connexion, déconnexion, inscription, password.request, password.email et password.reset). Ces routes sont ajoutées lorsque vous utilisez la ligne Route::auth();
dans le fichier de route.
Ajoutez simplement une route pour vous connecter dans le fichier routes:
Route::get('/login', [
'uses' => 'UserController@getSignin',
'as' => 'login'
]);