Ich versuchte heute zum ersten Mal mit Laravel zu spielen. Beim Versuch, localhost/project/public zu besuchen, wird folgende Fehlermeldung angezeigt:
InvalidArgumentException
Route [Login] nicht definiert.
app/routes.php:
<?php
Route::get('/', '[email protected]');
Route::get('login', '[email protected]');
Route::post('login', '[email protected]');
Route::get('dashboard', '[email protected]');
app/controller/HomeController.php:
<?php
class HomeController extends Controller {
public function redirect()
{
if (Auth::check())
return Redirect::route('dashboard');
return Redirect::route('login');
}
}
app/controller/LoginContoller.php:
<?php
class LoginController extends Controller {
public function show()
{
if (Auth::check())
return Redirect::route('dashboard');
return View::make('login');
}
public function do()
{
// do login
}
}
app/controller/DashboardController.php:
<?php
class DashboardController extends Controller {
public function show()
{
if (Auth::guest())
return Redirect::route('login');
return View::make('dashboard');
}
}
Warum erhalte ich diesen Fehler?
Sie versuchen, auf eine benannte Route zu leiten, deren Name login
ist, aber Sie haben keine Routen mit diesem Namen
Route::post('login', [ 'as' => 'login', 'uses' => '[email protected]']);
Der 'as'
-Teil des zweiten Parameters definiert den Namen der Route. Der erste String-Parameter definiert route.
In der App\Exceptions\Handler.php
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route('auth.login'));
}
Laravel hat benannte Routen in Laravel 4.2 eingeführt.
WAS IS NAMED ROUTES?
Named Routes ermöglicht Ihnen, Ihrem Router-Pfad Namen zu geben. Daher können Sie die Routen in der erforderlichen Datei anhand des Namens aufrufen.
WIE NAMED ROUTES ERSTELLEN?
Benannte Routen, die auf zwei verschiedene Arten erstellt wurden: as und name ()
METHODE 1:
Route::get('about',array('as'=>'about-as',function()
{
return view('about');
}
));
METHODE 2:
Route::get('about',function()
{
return view('about');
})->name('about-as');
Wie verwenden wir Ansichten?
<a href="{{ URL::route("about-as") }}">about-as</a>
Daher hat laravel 'middleware' => 'auth' bereits eine Umleitungsseite als Anmeldeseite definiert, wenn der Benutzer noch nicht angemeldet ist. Daher sollten wir as verwenden
Route::get('login',array('as'=>'login',function(){
return view('login');
}));
Sie müssen Ihrer web.php-Routendatei die folgende Zeile hinzufügen:
Auth::routes();
Falls Sie über benutzerdefinierte Auth-Routen verfügen, stellen Sie sicher, dass/login route 'as' => 'login' hat.
Im Falle einer API oder sagen wir dies bei der Implementierung von JWT. JWT-Middleware löst diese Ausnahme aus, wenn das Token nicht gefunden wurde, und versucht, auf die Anmeldungsroute umzuleiten. Da es keine angegebene Anmelderoute finden konnte, wird diese Ausnahme ausgelöst Route in "app\Exceptions\Handler.php"
verwenden Sie Illuminate\Auth\AuthenticationException.
protected function unauthenticated($request, AuthenticationException $exception){
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('ROUTENAME'));
}
Versuchen Sie diese Methode:
suchen Sie nach dieser Datei
"RedirectifAuthenticated.php"
aktualisieren Sie das Folgende wie Sie möchten
if (Auth::guard($guard)->check()) {
return redirect('/');
}
$ guard als Argument wird den Namen des von Ihnen festgelegten benutzerdefinierten Guard aufnehmen, z. "admin" dann sollte es so sein.
if (Auth::guard('admin')->check()) {
return redirect('/admin/dashboard');
}else{
return redirect('/admin/login');
}
Ich bin vor kurzem auf diesen Fehler gestoßen, nachdem ich das integrierte Authentifizierungsrouting von Laravel mit php artisan make:auth
verwendet hatte. Wenn Sie diesen Befehl ausführen, werden diese neuen Routen zu Ihrer Datei web.php hinzugefügt:
Auth::routes();
Route::get('/home', '[email protected]')->name('home');
Ich muss diese Routen versehentlich gelöscht haben. Durch Ausführen von php artisan make:auth
wurden die Routen erneut wiederhergestellt und das Problem behoben. Ich arbeite mit Laravel 5.5.28.
Laravel ^ 5.7 enthält eine neue Middleware, mit der nicht authentifizierte Benutzer behandelt und umgeleitet werden können.
Es funktioniert gut mit "web" guard ... natürlich sollte die " login " route (oder wie auch immer Sie Ihre login route nennen) im web definiert sein .php.
das Problem ist, wenn Sie Custom Guard verwenden. Ein anderer Wächter würde nicht authentifizierte Benutzer auf eine andere Route umleiten.
hier ist eine schnelle Problemumgehung, die auf der Antwort von John basiert (funktioniert bei mir).
app/Http/Middleware/ Authentifizieren Sie . php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* @var array
*/
protected $guards = [];
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string[] ...$guards
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$guards)
{
$this->guards = $guards;
return parent::handle($request, $next, ...$guards);
}
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
if (in_array('admin', $this->guards)) {
return route('admin.login');
}
return route('login');
}
}
}
Quelle: Ausgabe # 26292
Ersetzen Sie in Ihren Ansichten (Blade-Dateien) alle
{{ route ('/')}} ----- von ----> {{ url ('/')}}
Wenn jemand dies von einem Rest-Client (z. B. Postman) erhält - Sie müssen den Header auf Accept application/json setzen.
Klicken Sie dazu auf die Registerkarte Kopfzeilen, fügen Sie einen neuen Schlüssel "Accept" hinzu und geben Sie den Wert "Accept/Json" ein.
Route::post('login', '[email protected]')->name('login')
funktioniert sehr gut und ist sauber und selbsterklärend
Bin zu spät zur Party. Wenn Ihre Erwartung eine Art von Json ist, der anders als umgeleitet zurückgegeben wird, bearbeiten Sie den Ausnahmehandler.
Gehe zu App\Exceptions\Handler.php
.__ und bearbeite diesen Code:
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
zu
public function render($request, Exception $exception)
{
return response()->json(
[
'errors' => [
'status' => 401,
'message' => 'Unauthenticated',
]
], 401
);
}
versuchen Sie es mit der Kopfzeile Ihrer Anfrage hinzuzufügen: Accept = application/json postman add header