Laravel 8

Un site de réservation avec la TALL stack

  1. Partie 1
  2. Partie 2
  3. Partie 3 finale

 

 

Créer un blog

Une petite présentation du projet.

Le frontend

  1. Les données
  2. La page d’accueil
  3. Les articles
  4. Les commentaires 1/2
  5. Les commentaires 2/2
  6. L’authentification
  7. Contact et pages
  8. Social, erreurs, traductions et événement

Le backend

  1. L’administration
  2. Le tableau des articles
  3. Créer un article
  4. Modifier ou supprimer un article
  5. Les catégories
  6. Les utilisateurs
  7. Les commentaires
  8. Contacts et liens sociaux
  9. Les pages

Compléments

  1. Le profil
  2. Le RGPD
  3. Le déploiement

 

 

Cours Laravel 8

Laravel 8 a été publié officiellement. J’en profite pour toiletter un peu mon cours qui datait de la version 6.

I – Les bases

  1. Présentation générale
  2. Un environnement de développement
  3. Installation et organisation
  4. Le routage
  5. Les réponses
  6. Artisan et les contrôleurs
  7. Formulaires et middlewares
  8. La validation
  9. Envoyer un email
  10. Configuration, session et gestion de fichier
  11. Injection de dépendance, conteneur et façades

 

II – Les données

  1. Migrations et modèles
  2. Jouer avec Eloquent
  3. Les ressources (1/2)
  4. Les ressources (2/2)
  5. La relation 1:n
  6. La relation n:n
  7. Le polymorphisme
  8. Les ressources d’API

 

III – La sécurité

  1. L’authentification
  2. L’oubli du mot de passe
  3. Gestion du profil et API
  4. Les équipes
  5. Se passer de Jetstream
  6. On se protège

 

IV – Plus loin avec Laravel

  1. Les événements
  2. La localisation
  3. Les notifications
  4. Les vues
  5. Les tests
  6. Mix

 

Divers

 

 

Print Friendly, PDF & Email

26 commentaires

  • saxegaard88

    Bonjour,

    Je viens de terminer un petit projet sous LARAVEL 8, et j’essaie de le mettre en ligne mais on n’accède pas aux autres pages du site. Seul l’index du site semble fonctionner. Pas de soucis en local de chez moi.

    J’ai testé les modifications suivantes:
    – le fichier index.php avec le déplacement des fichiers du dossier public pour les mettre dans le répertoire racine,
    – le fichier proxi d’un middleware = ‘*’;
    – et bien évidemment le fichier .env avec les infos du server qui m’héberge:

    APP_NAME=LeNomDeMonApp
    APP_ENV=production
    APP_KEY=base64:jTByH5bXht+o9Nh6GBU0q7FBB4Y3IXqQSXh1UD2fVSk=
    APP_DEBUG=true
    APP_URL=https://monUrlduProjet.fr

    LOG_CHANNEL=stack
    LOG_LEVEL=debug

    DB_CONNECTION=mysql
    DB_HOST=MonHost
    DB_PORT=
    DB_DATABASE=NomDeLABaseChargée
    DB_USERNAME=MonUsernameSQLHost
    DB_PASSWORD=MonMdtSQLHost

    Sur un canal discord un gars m’a dis cela :
    /etc/apache2/sites-enabled/{app}.conf
    check if you got anything on sites-enabled for your app

    L’host m’a répondu de vérifier le reset du cache..

    Voilà je ne sais pas quoi essayer, seraient-ce les routes? les fichiers resources au format blade.php?

  • foxbille

    Bonjour,
    J’ai beaucoup de difficultés avec les routes. Pour une fonction edit/update, lors de la validation du formulaire j’ai une erreur not found HTTP 404

    dans routes/web.php :
    Route::resource(‘ventilations’, VentilationsController::class);

    routes:list donne bien ceci
    | | PUT|PATCH | ventilations/{ventilation} | ventilations.update | App\Http\Controllers\VentilationsController@update

    dans le controller :
    public function edit($ecriture_id) {
    $ventilations = Ventilation::select(‘*’)->join(‘programmes’, ‘ventilations.programme_id’, ‘=’, ‘programmes.id’)->where(‘ecriture_id’,$ecriture_id)->get();
    return view(‘ventilations.edit’, compact(‘ventilations’),[‘ecriture_id’=>$ecriture_id]);
    }

    dans resources/views/ventilations/edit.blade.php

    @csrf
    @method(‘put’)

    J’ajoute que j’ai installé debugbar et que la requete générée lors du click sur « modifier » est bien GET ventilations/{ventilation}/edit
    et lors de l’appui sur le bouton « save » du formulaire, c’est bien c’est bien PUT ventilations/{ventilation} qui est généré et que ce qu’on peut lire dans l’URL est bien http://localhost/test/laravel8/vvvvvvv/public/ventilations/6975, mais ne parvient meme pas jusqu’à la fonction « update » du controller
    Et j’ajoute enfin que tout ceci fonctionne très bien pour les trois autres controllers que j’ai développés en suivant le tuto « cours laravel 8 »
    Grrrrr,
    Bonne journée
    Eric

      • foxbille

        Tu veux dire virtualhost ? non, je fonctionne toujours comme ça, ca marche bien. Aussi bien avec d’autres frameworks tels que CodeIgniter4 ou CakePHP et Laravel pour tous mes dev, sauf ce controller ci.
        Je viens d’essayer avec le server proposé avec le paquet laravel
        php artisan serve
        sur l’url PUT http://localhost:8000/ventilations/6975 C’est pareil.
        Trouvé dans debugbar, sous l’onglet « route »
        ——–
        uri PUT ventilations/{ventilation}
        middleware web
        as ventilations.update
        controller App\Http\Controllers\VentilationsController@update
        namespace App\Http\Controllers
        prefix
        where
        file app/Http/Controllers/VentilationsController.php:125-133
        ——–
        En fait, c’est ImplicitRouteBinding.php qui « throw » une exception à la ligne 47
        Je tourne en rond…

        • foxbille

          Salut,
          Je pense avoir trouvé : le framework fait une requete sur la table pour en extraire l’enregistrement qu’il pense etre l’objet de EDIT/UPDATE et ce AVANT d’entrer dans le code de la methode update du controller. Dans mon cas, (je n’avais pas tout dit, mais on voit un peu les dessous de l’affaire dans la methode edit), ça ne correspond à rien, l’enregistrement n’existe pas sur ID. Dans cette methode EDIT, je modifie une série d’enregistrements qui ont une clé secondaire commune ecriture_id, dans la methode UPDATE, je pensais balayer le tableau POST pour faire les UPDATE de table successifs chacun sur sa clé.
          Je vais réfléchir à une autre solution, du coup, tu pourrais peut-etre virer tout mon commentaire ? Parce que ma question ne va pas aider grand monde.
          Merci en tous cas pour ce blog [qui m’est] extremement utile !
          Eric

        • bestmomo

          Salut,

          Tu n’as pas mis le code de ta méthode update dans le contrôleur. Mais si ça coince dans ImplicitRouteBinding c’est peut-être que le nom du paramètre dans la route (qui doit être ventilation puisque tu as une ressource) n’est pas le même que le nom du paramètre déclaré dans la méthode.

          Edit : je viens de lire ta dernière intervention qui rejoint finalement ma remarque ci-dessus… Logiquement on utilise l’update pour un enregistrement existant sinon il faut effectivement construire le code autrement.

  • foxbille

    Bonjour,
    Comment realiser un select sum(« if expression ») ?
    Supposons que j’aie à faire un « select(field1, field2, sum(« if(expression,value_if_true, value_if_false) ») from … »
    Et qu’il y ait des multiples sum() qui dependraient du contenu d’une autre table .

    Je pensais que ceci marcherait dans un controller, mais non.

    $ecrituresventilees = Ecritures::select(‘date’, ‘operation’, ‘montant’);
    foreach ($programmes as $programme):
    $t= »if(`programme`=’$programme->libelle’,`montantventile`,0) ) as ‘$programme->libelle' »;
    $ecrituresventilees->sum(DB::raw($t));
    endforeach;
    $ecritures->groupBy(‘date, operation, montant’)->get();

    Ca provoque une erreur à la première iteration
    SQL 1064 (syntax error) […] at line 1 (SQL: select sum(if(`programme`=’Copropriété Lilas’,`montantventile`,0)) as ‘Copropriété Lilas’) as aggregate from `ecritureventilees`)
    Bon, c’est un peu complexe à lire quand on est pas dedans depuis des heures…
    Une piste ?
    Merci et bonne journée
    Eric

  • foxbille

    Bonjour,
    J’ai un peu de mal avec le format des dates.
    De Y-m-d dans les tables à d/m/Y dans les formulaires et listes, on a sans cesse besoin de formater.
    Dans le cas des « view » j’ai trouvé ça : {{ date(‘d/m/Y’, strtotime($auto->date)) }} qui marche très bien
    Mais ça se corse au « retour », lorsqu’il faut injecter la date dans la BDD
    Je suis tombé sur accessor/mutator, génial : une fonction getDateAttribute / setDateAttribute contenant mes routines PHP qui « retournent » la date, et le tour est joué.
    Sauf que du coup on dirait que les requetes de ce genre :
    $autos = Auto::all()->sortBy('date')->where('compte_id',$compte_id)->where('date','<=',date('Y-m-d'));
    ne produisent plus aucun résultat (quand j'ote le "where('date…" ça re-marche ) .
    Quelle est la bonne stratégie pour ne pas s'emm^eler les pinceaux avec ces f…ues dates ?
    Question subsidiaire : quand on a une routine commune à plusieurs "controller", on la case ou ?
    Merci, cordialement,
    Eric

    • bestmomo

      Salut,
      Oui les dates, c’est toujours délicat… Eloquent est quand même souple quand on veut sauvegarder une date et reconnait aussi bien 2021-04-10, qu’un datetime ou une instance Carbon. Pour ce qui est de l’affichage il existe plein de solutions et Carbon est bien équipé également.
      Le souci des accessor/mutator c’est qu’ils traitent toutes les valeurs même quand on ne veut pas. Je les utilise très rarement. En général je crée des routines dans un fichier helpers qui me permet d’en disposer partout.

  • jondelweb

    Salut BestMomo,

    J’ai un souci et je ne trouve pas de réponse malgré mes nombreuses recherches… Je ne comprends pas pourquoi et ça m’agace…

    Je m’explique…

    La stack : laravel 8, JetStream, Livewire

    J’ai un formulaire dans une vue « guest » qui est relié a un controller. Dans celui-ci, j’effectue tout un tas de traitement et je créé « à la volée » un User. Je connecte celui-ci via la methode Auth::attempt() et lorsque celui-ci est connecté, je le redirige vers la vue « dashboard » (Que je n’ai pas touché).

    Et c’est là que j’ai mon souci, j’ai un écran blanc (of the death) !!!

    L’utilisateur est bien connecté car si je met le @livewire(‘navigation-dropdown’) dans une vue « guest », il s’affiche bien et je peux déconnecter mon User (et du coup, la vue ne fonctionne plus…)

    Je me demande si c’est parce que je le crée « à la volée » (cad sans passer par fortify) et que je le connecte « manuellement ».

    Je ne vois pas comment overrider les méthodes de fortify et en tout cas, je n’ai pas de solutions…

    Une idée peut-être ?

    Merci d’avance…

    • bestmomo

      Salut,

      Il n’y a rien de spécial à ce niveau avec Jetstream. Si on regarde dans le contrôleur on trouve :
      return view('profile.show', [
      'request' => $request,
      'user' => $request->user(),
      ]);

      Je suppose que dans ta situation on n’a pas encore l’utilisateur en session et du coup $request->user() est null.
      Regarde la réponse donnée ici.

      • jondelweb

        Re salut,

        Merci pour ta réponse mais je ne suis pas certain de comment faire…

        J’ai rajouter :

        « `
        $request->session()->put(‘user_id’, $user->id);
        « `
        dans mon controller mais ça ne change rien… J’ai toujours mon put… d’écran blanc sur mon dashboard…

      • jondelweb

        En fait c’est vraiment bizarre…

        dans route.php j’ai :

        Route::middleware([‘auth’])->group(function () {
        Route::get(‘/dashboard’, [DashboardController::class, ‘index’])->name(‘dashboard’);
        });

        Dans mon dashboardController j’ai :

        public function index() {

        dd(‘toto’);
        return view(‘dashboard’);
        }

        et dans mon controller pour faire l’authentification après tous les traitement, j’ai :

        $this->updateSession($request,$user->id);

        // authentification du user
        $credentials = $request->only(’email’, ‘password’);

        if (Auth::attempt($credentials)) {
        return redirect()->route(‘dashboard’);
        } else {
        return view(‘welcome’);
        }
        }

        function updateSession(Request $request, $id)
        {
        $request->session()->put(‘user_id’, $id);
        $request->session()->migrate(true);
        }

        Et ben je vais bien sur la route ‘dashboard’ (je la vois dans l’url) mais on dirait que ça ne passe même pas dans le dashboardController car le dd(‘toto’) ne s’effectue pas…

    • bestmomo

      Salut

      Si tu observes bien les évolutions récentes tu verras que Vue est peu à peu abandonné en tant que librairie frontend sauf pour les SPA. La mode est à la légèreté avec Alpine.js et autres librairies légères. Personnellement j’en suis même revenu au Vanilla Javascript.

      Il n’y a qu’à voir Jetstream pour se rendre compte de cette évolution.

Laisser un commentaire