Bonjour,

J'ai beau chercher dans mon code et sur internet, je ne trouve pas et m'arache les cheveux.. Une ptite aide svp !

Ce que je fais

Avant tout, je suis sous Laravel 5.5. Le problème survient comme suit : je me connecte sans vouloir une session automatique, je vais sur mon administration. Le temps passe sans recharger la page jusqu'à ce que ma session expire. Ainsi, si je retourne sur ma page et que je clique n'importe où, je devrai être redirigé sur ma page d'accueil (grâce au middleware RedirectIfAuthenticated).

Ce que j'obtiens

Sauf que j'obtiens l'erreur : InvalidArgumentException Route [login] not defined. Ma route login est bien définie :

<?php
Route::group([
    'namespace' => 'Auth',
    'prefix'    => 'client'
], function () {
    /**
     * Login & Logout routes
     */
    Route::get('connexion', 'LoginController@showLoginForm')
        ->name('login.get');

    Route::post('connexion', 'LoginController@login')
        ->name('login.post');

    Route::post('déconnexion', 'LoginController@logout')
        ->name('logout.post');

    Route::get('logout', function () {
        return back();
    });
etc ...
});

J'ai modifié mes routes, mais comme elles sont toutes nommées, il ne devrait pas y avoir d'incidence. J'ai surement loupé quelque chose, mais je ne vois pas où. Avant, ça me renvoyait sur la page d'accueil et en étant déconnecté..

Merci d'avance !

7 réponses


Hello,
Laravel te dit que la route login n'existe pas, et en effet quand je regarde ton code tu n'as aucune route qui se nomme login .

Si tu renomme login.get en login tu ne devrais plus avoir cette erreur :

    Route::get('connexion', 'LoginController@showLoginForm')
        ->name('login');

après évite de mêttre des accents sur tes routes c'est pas top ^^

JeremyB
Auteur

Merci pour ta réponse.

J'ai ajouté la route mais ça ne marche pas (je m'en doutais un peu mais bon.. :/). Il me dit toujours que la route login n'est pas définie, or c'est faux. La question qui résoudrait beaucoup de chose est : quel fichier appelle cette route ! Du genre return redirect()->route('login') quand la session expire.. là je bloque..

1, Est-ce que ta utiliser system d'authentication de Laravel? si oui est-ce que ta bien créé l'authentication Ex: php artisan make:auth, tu peut vérifier en linge de commmande php artisan route:list, par default tu ne peut pas voir les route d'authentification dans fichier de route web.php. tu peut appeler avec le nom de la route.

JeremyB
Auteur

Alors oui, j'utilise le système par défaut avec des petites réécritures des fonctions de Laravel. Dans web.php, de base, il y a Auth::routes(). J'ai réécris ces routes et cela me donne :

(Le code correspondant se trouve plus haut)

EDIT : avant hier, j'ai beaucoup remanié mes fichiers pour une meilleure arborescence. J'ai du modifier des liens, les routes etc pour que tout pointe correctement. Je fais toujours un php artisan config:cache mais jamais :

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan config:clear

Le nettoyage de tout ça résoudra peut-être mon problème, je reviendrai vers vous lorsque ma session aura expiré.

je crois problème qui vient de configuration de serveur.
tu es dans quel environnement? essaie avec php artisan serve
Est-ce que module rewrite est active? et le fichier .htaccess est-ce que bien configurer?

essaie avec ça, pour le fichier .htacccess (n'oublie pas change RewiteBase)

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteBase /laravel/public/
   # change above to your site i.e.,  RewriteBase /whatever/public/

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
JeremyB
Auteur

Je vais te répondre puis te dire ce que j'ai essayé.

Je suis sous Archlinux et je travaille en local sans utiliser php artisan serve. J'ai bien le module mod_rewrite de chargé par php 7.1.11. et mon fichier .htaccess est quasi identique à ce que tu proposes :

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Ce que j'ai essayé : j'ai créé une autre appli rapide avec laravel new test, puis un simple php artisan make:auth. Même test, je me connecte, j'attends que ma session expire puis je rafraichis la page. Et là, ça fonctionne, je retourne bien sur la page d'accueil en étant déconnecté.

Je fais donc temporairement supprimer /app/Http/Controllers/Auth ainsi que /resources/views/auth et refaire un php artisan make:auth. Si cela fonctionne, sans toucher à mes routes, c'est que le problème résidant dans mon controller.

A toute !

JeremyB
Auteur

Je reviens vers vous après avoir trouvé le problème : il fallait être connecté sur la partie administration, attendre que la session expire pour être considéré comme déconnecté, et rafraichir la page. En réalité, en étant simple visiteur et en voulant accéder à la partie administration, j'obtiens le même résultat.

Ainsi, c'est un problème dans le App\Exceptions\Handler. Il faut en fait réécrire la fonction unauthenticated de 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)
    {
        return $request->expectsJson()
                    ? response()->json(['message' => $exception->getMessage()], 401)
                    : redirect()->guest(route('login'));
    }

On retrouve bien route('login') au lieu de route('login.get') dans ma route personnalisée.

Ainsi, je pense rajouter dans ma route personnalisée et éviter de réécrire une fonction dans le Handler juste pour ça :

Route::namespace('Auth')->group(function () {
    Route::get('connexion', 'LoginController@showLoginForm')
        ->name('login');
});