Laravel 8
Un site de réservation avec la TALL stack
Créer un blog
Une petite présentation du projet.
Le frontend
- Les données
- La page d’accueil
- Les articles
- Les commentaires 1/2
- Les commentaires 2/2
- L’authentification
- Contact et pages
- Social, erreurs, traductions et événement
Le backend
- L’administration
- Le tableau des articles
- Créer un article
- Modifier ou supprimer un article
- Les catégories
- Les utilisateurs
- Les commentaires
- Contacts et liens sociaux
- Les pages
Compléments
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
- Présentation générale
- Un environnement de développement
- Installation et organisation
- Le routage
- Les réponses
- Artisan et les contrôleurs
- Formulaires et middlewares
- La validation
- Envoyer un email
- Configuration, session et gestion de fichier
- Injection de dépendance, conteneur et façades
II – Les données
- Migrations et modèles
- Jouer avec Eloquent
- Les ressources (1/2)
- Les ressources (2/2)
- La relation 1:n
- La relation n:n
- Le polymorphisme
- Les ressources d’API
III – La sécurité
- L’authentification
- L’oubli du mot de passe
- Gestion du profil et API
- Les équipes
- Se passer de Jetstream
- On se protège
IV – Plus loin avec Laravel
Divers
- Ma première application Laravel 8
- Livewire – introduction
- Le bazar de l’authentification
- Laravel Filament
- La TALL Stack
- Livewire Datatable
- Livewire Fullcalendar
32 commentaires
neto
Bonjour monsieur,
S’ il vous plait ,lorsque je suis sur mon tableau de bord je n’ arrive pas a crée un nouveau utilisateur(J’ai appliqué le CRUD ), que faire ? Bien que je ne veuille pas que les utilisateurs créent leurs propres comptes .J utilise laravel 8 et laravel breeze est le moyen que j’ai appliqué pour m’authentifier.
bestmomo
Bonjour,
Il faudrait plus de précision pour répondre…
neto
bonjour monsieur,
s’ il vous plait ,j’ai installé laravel 8, ensuite j ai installé breeze sur l’application , j’ai créé une base de donnée que j ai liée à l’application laravel, ensuite j’ai effectué la migration des tables que j’ai créé, mais avant cela j’ai créé les modèles aux tables et appliqué le CRUD au controllers au table que j ai créé ainsi qu’a la table user. Après avoir fais cela j ai aménagé mon tableau de bord et je suis parti sur la page de mon application pour m’identifier , ce qui s’est bien passé me laissant avoir accès au tableau de bord. Ensuit j ai remarquée que lorsque je voulais enregistrer un article ou la modifier ou même modifier des informations sur un utilisateur tout ce passais bien mais lorsque je voulais enregistrer un nouveau utilisateur ceci ne passe pas (je saisie tout les informations sur le nouveau utilisateur mais lorsque j appuis sur valider ceci me renvois sur la page de la liste des utilisateur sans erreur mais sans nouveau utilisateur enregistrer ,ainsi que dans ma base de donné). Mais lorsque je me déconnecte et j enregistre le nouveau utilisateur via le register , celui ci s’enregistre automatiquement, alors que je voudrais que seul ceux qui ont un compte peuvent enregistrer un nouveau utilisateur .
bestmomo
Salut,
Je vois le processus, mais sans voir le code, on ne peut pas savoir quel est le problème, il faudrait mettre à disposition ce code quelque part pour essayer l’application.
D57
salut la famille
Comment utiliser l’API youtube en laravel 8?
vos explications ou documentations seront bien venues
kemeni
bonjour j’ai installer laravel 8 tous marche bien mais quand je veux faire des test unitaire la fonction
withoutExceptionHandling ne stop pas le reporting des erreurs
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
bestmomo
Salut,
Tu ne crées pas des local host en local histoire d’avoir une url saine ?
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
bestmomo
Salut,
Tu peux peut-être utiliser cette syntaxe :
select(field1, field2, SUM(CASE WHEN expression IS TRUE THEN ... ELSE ... END) ») from
foxbille
Bonjour,
Merci pour la réponse, mais comment tu écris ça avec le langage de requete ?
En fait j’ai mal lu le message d’erreur, on y voit bien que le problème vient du complémént à la clause, le ‘as …’ qui est mal geré car Eloquent génère une parenthèse (de trop) juste après. J’ai donc l’explication, mais pas la solution…
bestmomo
Salut,
Quand on a une syntaxe particulière dans un SELECT on peut utiliser selectRaw.
foxbille
Merci, c’est sans doute l’équivalent de select(DB:Raw(…).
du coup, ça marche.
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.
foxbille
Ok, merci !
Lorelle
Bonjour, je peux avoir le cours en version offline?
bestmomo
Bonjour,
Il n’y a pas de version offline mais on peut charger en PDF tous les articles.
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
Tu aurais pas déjà une route du même nom avec Jetstream qui s’exécute avant ?
jondelweb
Ben j’ai pas l’impression…
Même quand je fais :
return redirect()->action([DashboardController::class, ‘index’]);
Ca ne passe même pas dedans…
Lerado
Ah Laravel 8 !
Euh bestmomo, ce serait pas le moment idéal pour penser à ce dont on avait parlé à savoir:
UNE APP Vue.js (front-end) + Laravel (api) 🙂
J’en ai déjà fait mais ça serait trop cool de te suivre sur un tel projet.
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.
Mody
bonjour ! ça y est ! franchement merci davantage. je vous souhaite le meilleur dans l’avenir et vos tutos sont merveilleux
Youssef
Salut, et merci beaucoup pour les grands efforts. grasse de vous j’ai appris beaucoup de choses .