Ce que je voudrais, c'est que lorsque l'on arrive sur une page ou l'authentification est nécéssaire, on soit redirigé vers l'accueil et que ça ouvre automatiquement ma popup de login.

En fait j'ai réussi et ça fonctionne, je voudrais juste avoir votre avi sur ma façon de procéder.

J'ai modifié la class du middleware Authenticate comme ceci :

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            $request->session()->put('loginModal', 'yes');
            return route('welcome');
        }
    }
}

Donc si l'user est redirigé car il n'est pas authentifié, j'ajoute en session loginModal : yes.

Ensuite, dans le template, j'ai fait comme ceci :

    @if($errors->has('auth.email') OR (!empty(Session::get('loginModal')) && Session::get('loginModal') == 'yes'))
      <script>
      $(function() {
          $('#loginModal').modal('show');

      });
      </script>
      @php Request:session()->forget('loginModal'); @endphp
    @endif

J'efface la session à la fin, mais je me demande si cela est vraiment propre, s'il n'y a pas une manière plus subtile de procéder ? Comme utiliser le welcome controller peut etre...

Merci d'avance ! :)

4 réponses


Bonjour Yann,

Je ne connais pas le framework Laravel, mais j'ai quand même quelque sugestions à te faire (après à toi de voir si c'est possible...) :

  • plutôt que de passer la variable "loginModal" via la session, est-ce que tu n'a pas plutôt la possibilité de la passer via la fonction "route()" ?
  • dans le template, remplacer "(!empty(Session::get('loginModal')) && Session::get('loginModal') == 'yes')" par "Session::get('loginModal', 'no') == 'yes'" (possible d'après la doc de la version 5.0)

Bonjour Soundboy, merci pour ta réponse !

Si j'ai d'abord tenté de la passer via la fonction route avec la fonction with() comme ceci : return route('welcome')->with(''loginModal', 'yes');
Mais j'avais cette erreur : Call to a member function with() on string.

Pour le template, yes ça fonctionne merci :)

OK super pour le template.

Pour ton erreur, en fait la fonction "route()" retourne une chaine de caractères, toi tu fait comme si elle te retournait un objet ayant une méthode "with".

Je m'arrête là, je ne connais pas assez Laravel.

Bon courage,

Pour ton return faut pas faire return redirect()->route('welcome') ?

Et pour la modal plus simple ce serait de passer par un component
Par exemple avec blade-x

Controller:

public function index ()
{
    $logged = Auth::check();

    return view('welcome')->with(
        ['logged' => $logged]
    );
}

welcome.blade.php:

<x-alert-login-modal :logged="$logged" />

App/Views/AlertLoginModal:

class AlertLoginModal extends Component {
    public bool $logged;
    public bool $showModal;

    public function __construct(bool $logged)
    {
        $this->logged = $logged;
        this->showModal = true;
    }

    public function render()
    {
        return view('component.alert-login-modal');
    }

    public function closeModal()
    {
        // Si le mec a fermé ta modal, ou alors tu peux le faire en JS aussi :p
        $this->showModal = false;
    }
}

component/alert-login-modal.blade.php:

@if(!$logged && $showModal)
    <la_modal class="fade-in">
        <blabla></blabla>
    </la_modal>
@endif

Ou bien un component React ou Vue, faudra juste adapter le code a React ou Vue
Pour blade-x je l'ai fait de mémoire donc faudra surement arranger le code ^^'
Et le component se fait avec php artisan make:component AlertLoginModal pour blade-x, et a la mano pour les autres façon de faire :p