-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex0.html
570 lines (570 loc) · 32.2 KB
/
index0.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="etapes.css"/>
<script src="etapes.js"></script>
<title>Étapes</title>
</head>
<body>
<div class="interface">
<header>
<h1>Un site Web avec Laravel</h1>
<h2>Les étapes</h2>
</header>
<nav>
<ul>
<!-- <li><a href="#" id="mnu_videos" onclick="document.body.classList.toggle('videos');">Afficher les vidéos</a></li>-->
<li><a href="#installation">Laravel 1</a></li>
<li><a href="#basededonnees">Laravel 2</a></li>
<li><a href="#posts_index">Laravel 2.5 (minitest)</a></li>
</ul>
</nav>
<footer>Les vidéos sont disponibles sur <a href="https://www.youtube.com/channel/UCFWzWuHnqYOlBN2lJhBIGNg">la chaîne Youtube</a></footer>
<div class="body">
<ol>
<li id="installation" data-video="sZ8crC_QQKU">
<h2>Installer l'application <cite>Laravel</cite></h2>
<ol>
<li>Créer le dossier <span class="fichier">projetlaravel</span></li>
<li>Ouvrir le dossier dans le <cite class="app">Terminal</cite></li>
<li>Exécuter <span class="commande copiable">composer create-project laravel/laravel .</span></li>
<li>Exécuter ls et regarder le contenu du dossier dans le <cite class="app">Finder</cite>.</li>
<li>Exécuter <span class="commande copiable">php artisan serve</span></li>
<li>Ouvrir le site dans <cite class="app">Chrome</cite></li>
<li>Ouvrir le dossier dans <cite class="app">Brackets</cite></li>
<li>Réarranger les fenêtres en panneaux</li>
<li>Regarder le fichier <span class="fichier">public/robots</span> et le modifier en observant les changements dans le fureteur.</li>
</ol>
</li>
<li id="routes" data-video="N0pxSP6-ou4">
<h2>Les routes</h2>
<ol>
<li>Ouvrir le fichier <span class="fichier">routes/web.php</span></li>
<li>Modifier l'adresse et la valeur de retour et tester le résultat.</li>
<li>Dupliquer la route (garder la route originale avec l'adresse <span class="string">"/welcome"</span>)</li>
<li>Faire afficher <span class="string">"Dans la route"</span></li>
<li>Changer l'action pour le controller <span class="string">"UserController@index"</span></li>
<li>Tester la page et constater l'erreur.</li>
</ol>
</li>
<li id="modelcontroller" data-video="j2-moIHddWU">
<h2>Créer le model et les controllers</h2>
<ol>
<li>Regarder le contenu des dossiers <span class="fichier">/app</span> et <span class="fichier">/app/http/controllers</span> ainsi que le fichier <span class="fichier">/app/User.php</span></li>
<li>Rouvrir le dossier du projet dans le <cite>Terminal</cite> (une nouvelle fenêtre).</li>
<li>Exécuter <span class="commande copiable">php artisan list</span></li>
<li>Regarder les commandes possibles, dont <code>make:model</code> et <code>make:controller</code></li>
<li>Exécuter <span class="commande copiable">php artisan make:model Post -mrc</span></li>
<li>Regarder les nouveaux fichiers <span class="fichier">/app/Post.php</span> et <span class="fichier">/app/http/controllers/PostController.php</span></li>
<li>Exécuter <span class="commande copiable">php artisan make:controller UserController -r</span></li>
<li>Ouvrir le fichier <span class="fichier">PostController.php</span> et regarder les méthodes ajoutées par l'option <span class="string">r</span></li>
<li>Ajouter l'instruction <code class="php copiable">return "Dans le controller";</code> dans la méthode (ou action) <code>index()</code></li>
<li>Tester la page.</li>
</ol>
</li>
<li id="nouveauuser" data-video="7zmz8vZjLKM">
<h2>Créer un user</h2>
<ol>
<li>Regarder le fichier <span class="fichier">User.php</span>. On n'a rien à faire ici pour l'instant.</li>
<li>Retourner à l'action <span class="controller">UserController@index</span>.</li>
<li>Ajouter l'instruction <code class="php copiable">$user = new User();</code> et constater l'erreur.</li>
<li>Ajouter temporairement le <cite>namespace</cite> : <code class="php copiable">$user = new <b>\App\</b>User();</code> et ça marche.</li>
<li>Ajouter l'instruction <code class="php copiable">use App\User;</code> ou <code class="php copiable">use App\User as User;</code> avant la définition de la classe.</li>
<li>Enlever le <cite>namespace</cite>.</li>
<li>Retourner la variable <var>$user</var> et tester la page. Affiche un tableau vide en JSON.</li>
<li>Ajouter l'instruction <code class="php copiable">$user->prenom = "Rita";</code></li>
<li>Ajouter l'instruction <code class="php copiable">$user->nom = "Raté";</code></li>
<li>Tester la page.</li>
</ol>
</li>
<li id="faker" data-video="WhANPheGAao">
<h2>Ajouter un user bidon avec le Faker</h2>
<ol>
<li>Ajouter l'instruction <code class="php copiable">$f = \Faker\Factory::create("fr_CA");</code> au début de la méthode.</li>
<li><p>Mettre des données bidon avec le Faker</p>
<div class="bloccode php copiable">
<div>$user->prenom = $f->firstName();</div>
<div>$user->nom = $f->lastName();</div>
<div>$user->email = $f->lastName();</div>
<div>$user->tel = $f->phoneNumber();</div>
<div>$user->adresse = $f->streetAddress();</div>
<div>$user->ville = $f->city();</div>
<div>$user->province = $f->state();</div>
<div>$user->codepostal = $f->postcode();</div>
<div>$user->citation = $f->paragraph();</div>
</div>
</li>
<li>Voir l'aide du <a href="https://github.com/fzaninotto/Faker" target="_blank">Faker</a></li>
<li><p>Placer le code dans le model <span class="fichier">User.php</span> en créant une fonction statique.</p>
<div class="bloccode php copiable">
<div>static public function fake() {</div>
<div> $f = \Faker\Factory::create("fr_CA");</div>
<div> $resultat = new self();</div>
<div> $resultat->prenom = $f->firstName();</div>
<div> $resultat->nom = $f->lastName();</div>
<div> $resultat->email = str_slug($resultat->prenom.$resultat->nom, '')</div>
<div> .'@'.$f->domain();</div>
<div> $resultat->tel = $f->phoneNumber();</div>
<div> $resultat->adresse = $f->streetAddress();</div>
<div> $resultat->ville = $f->city();</div>
<div> $resultat->province = $f->state();</div>
<div> $resultat->codepostal = $f->postcode();</div>
<div> $resultat->citation = $f->paragraph();</div>
<div> return $resultat;</div>
<div>}</div>
</div>
</li>
<li>Utiliser la méthode dans le controller. <span class="php copiable">$user = User::fake();</span></li>
</ol>
</li>
<li id="view" data-video="YGlbmKL-DiU">
<h2>Utilisation de la view</h2>
<ol>
<li>Dans le controller <span class="controller">UserController@index</span>, faire afficher la view <span class="view">users.index</span> : <span class="php copiable">return view("users.index");</span></li>
<li>Créer la view <span class="view">users.index</span> : c'est à dire créer le dossier <span class="fichier">/resources/views/users</span> et le fichier <span class="fichier">/resources/views/users/index.blade.php</span></li>
<li>Ajouter <span class="blade copiable">{{$user}}</span> et sauvegarder.</li>
<li>Tester et constater l'erreur.</li>
<li>Envoyer la variable <var>user</var> à la view : <span class="php copiable">return view("users.index", ['user'=>$user]);</span></li>
<li>Tester et constater l'affichage au format JSON.</li>
<li><p>Dans la view, faire afficher chaque information individuellement.</p>
<div class="bloccode blade copiable">
<div><h1>{{$user->prenom}} {{$user->nom}}</h1></div>
<div><div>{{$user->email}}</div></div>
<div><div>{{$user->tel}}</div></div>
<div><div>{{$user->adresse}}</div></div>
<div><div>{{$user->ville}} {{$user->province}}</div></div>
<div><div>{{$user->codepostal}}</div></div>
<div><p>{{$user->citation}}</p></div>
</div>
</li>
</ol>
</li>
<li id="template" data-video="a277KeS9nn0">
<h2>Ajout du template</h2>
<ol>
<li>Télécharger un template de <a target="_blank" href="http://templatemo.com">templatemo.com</a></li>
<li>Mettre le contenu du dossier dans le dossier <span class="fichier">public</span></li>
<li>Visiter la page <a href="http://localhost:8000/index.html">http://localhost:8000/index.html</a></li>
<li>Mettre les pages HTML dans le dossier <span class="fichier">public/interface</span> et les renommer <span class="fichier">nom_de_la_view.blade.php</span></li>
<li>Dans le controller, faire temporairement afficher la view <span class="view">interface.index</span>. <span class="php copiable">return view("interface.index");</span></li>
<li>Faire une normalisation partielle de l'interface en fonction du template choisi. Typiquement, créer des fichiers : <span class="fichier">header.blade.php</span>, <span class="fichier">footer.blade.php</span>, <span class="fichier">content.blade.php</span>, <span class="fichier">top.blade.php</span>, <span class="fichier">bottom.blade.php</span>, <span class="fichier">nav.blade.php</span>...</li>
<li>Ajouter les <code>@include</code> et tester.</li>
</ol>
</li>
<li id="pagemaitresse" data-video="wFBQBunvK4g">
<h2>La page maîtresse</h2>
<ol>
<li>Repérer la zone principale du contenu.</li>
<li>Ajouter au début <span class="blade copiable">@section("contenu")</span> et à la fin <span class="blade copiable">@show</span>.</li>
<li>Optionnelement, faire afficher <var>$user</var> pour voir s'afficher sa valeur.</li>
<li>Dans le controller, remettre la view <span class="view">"users.index"</span> (Ça ne changera plus)</li>
<li>Au début de la view <span class="view">"users.index"</span>, ajouter la commande <span class="blade copiable">@extends("contenu")</span></li>
<li>Envelopper le contenu existant de <span class="blade copiable">@section("contenu")</span> et <span class="blade copiable">@endsection</span></li>
<li>Ajouter une autre section dans la page maîtresse et dans la page pour afficher spécifiquement le nom.</li>
</ol>
</li>
<li id="component" data-video="hvtjfrZkY7c">
<h2>Le component</h2>
<ol>
<li>Créer la view <span class="view">interface.post</span> avec le html d'un post du template.</li>
<li>Rendre le post générique en ajoutant des variables.</li>
<li>Dans la boucle de la view <span class="view">users.index</span>, tester l'appel à cette view en lui envoyant des données pour les variables.</li>
<li>Envelopper le contenu de la section des commandes <span class="blade copiable">@component("interface.post")</span> et <span class="blade copiable">@endcomponent</span></li>
<li><p>Pour chacune des variables du component (donc, de la view) créer une slot</p>
<div class="bloccode blade copiable">
<div>@slot("nom_de_la_variable")</div>
<div> <h2>{{$bidule}}</h2></div>
<div>@endslot</div>
</div>
</li>
</ol>
</li>
<li id="boucle" data-video="VBApEJY0U3E">
<h2>La boucle</h2>
<ol>
<li><p>Dans le controller, créer un tableau <var>$users</var> avec plusieurs objets <var>User</var> et l'envoyer à la view.</p>
<div class="bloccode php copiable">
<div>$users = [];</div>
<div>for ($i = 0; $i < 10; $i += 1) {</div>
<div> $users[] = User::fake();</div>
<div>}</div>
<div>return view("users.index", ['user<strong>s</strong>'=>$user<strong>s</strong>]);</div>
</div>
</li>
<li><p>Dans la view, ajouter une boucle qui enveloppe le contenu de la section avec <span class="blade copiable">@foreach($users as $user)</span> et <span class="blade copiable">@endforeach</span></p></li>
<li>Voir le <a href="https://learninglaravel.net/cheatsheet/#blade" target="_blank">cheatsheet sur <var>Blade</var></a> pour les autres commandes possibles.</li>
</ol>
</li>
<li id="basededonnees" data-video="ZpOq9oimnpM">
<h2>La base de données</h2>
<ol>
<li>Ouvrir le fichier <span class="fichier">/.env</span> afin de voir la configuration par défaut d'une connexion MySQL. Puis de refermer.</li>
<li>Ouvrir <span class="fichier">/config/database.php</span></li>
<li><p>Adapter les lignes suivantes :</p>
<div class="bloccode blade copiable">
<div>'default' => '<b>sqlite</b>',</div>
<div><samp>// et</samp></div>
<div><samp>'driver' => 'sqlite',</samp></div>
<div>'database' => <b>database_path('database.sqlite')</b>,</div>
</div>
<p>Ne pas oublier de changer le nom de la base de données.</p>
<p>Remarquer l'utilisation de <var>database_path</var>.</p>
</li>
<li>Créer la route qui réinitialisera la base de données : <span class="php copiable">Route::get('/reset', 'AppController@reset');</span></li>
<li>Créer le controller correspondant : <span class="commande copiable">php artisan make:controller AppController</span></li>
<li><p>Ouvrir le controller <span class="controller">AppController</span> et ajouter la méthode (non statique) <var>reset</var></p>
<div class="bloccode blade copiable">
<div>public function reset () {</div>
<div> $db = \DB::connection()->getDatabaseName();</div>
<div> file_put_contents($db, '');</div>
<div> <em>//Artisan::call("migrate");</em></div>
<div> <em>//Artisan::call("db::seed");</em></div>
<div> return "La base de donnée a été réinitialisée";</div>
<div>}</div>
</div>
</li>
<li>Tester et constater la création d'un fichier vide <span class="fichier">/database/database.sqlite</span></li>
<li>Ouvrir la base de données dans <cite class="app">SQLite Browser</cite>.</li>
</ol>
</li>
<li id="migration" data-video="7lfMkRcDd7k">
<h2>Les migrations</h2>
<ol>
<li>Dans le terminal, lancer la migration <span class="commande copiable">php artisan migrate</span></li>
<li>Tester les commandes <span class="commande copiable">php artisan migrate:rollback</span> et <span class="commande copiable">php artisan migrate:reset</span>.</li>
<li>Analyser l'effet de ces commandes sur les tables dans <cite class="app">SQLite Browser</cite>.</li>
<li>Décommenter ou ajouter la migration dans le controller et tester.</li>
</ol>
</li>
<li id="migration_users" data-video="iToZxcxDoVo">
<h2>La migration des users</h2>
<ol>
<li>Dans le terminal, lancer la migration <span class="commande copiable">php artisan migrate</span></li>
<li>Tester les commandes <span class="commande copiable">php artisan migrate:rollback</span> et <span class="commande copiable">php artisan migrate:reset</span>.</li>
<li>Analyser l'effet de ces commandes sur les tables dans <cite class="app">SQLite Browser</cite>.</li>
<li>Décommenter ou ajouter la migration dans le controller et tester.</li>
<li>Ouvrir le fichier de migration des users qui se trouve dans le dossier <span class="fichier">/database/migrations/</span></li>
<li>Ajouter la création des champs supplémentaires du modèle : "prenom", "nom", "tel", "adresse", "ville", "province", "codepostal" et "citation"
<div class="bloccode php copiable">
<div><samp>$table->increments('id');</samp></div>
<div><samp>$table->string('name');</samp></div>
<div><samp>$table->string('email')->unique();</samp></div>
<div><samp>$table->string('password');</samp></div>
<div>$table->string("prenom");</div>
<div>$table->string("nom");</div>
<div>$table->string("tel");</div>
<div>$table->string("adresse");</div>
<div>$table->string("ville");</div>
<div>$table->string("province");</div>
<div>$table->string("codepostal");</div>
<div>$table->text("citation");</div>
<div><samp>$table->rememberToken();</samp></div>
<div><samp>$table->timestamps();</samp></div>
</div>
</li>
<li>Voir le <a href="https://learninglaravel.net/cheatsheet/#schema" target="_blank">cheatsheet sur les <var>Schema</var></a> pour le types de données.</li>
<li>Ajouter les champs de la migration des posts.
<div class="bloccode php copiable">
<div><samp>$table->increments('id');</samp></div>
<div>$table->integer("user_id");</div>
<div>$table->string("titre");</div>
<div>$table->text("contenu");</div>
<div><samp>$table->timestamps();</samp></div>
</div>
</li>
<li>Ajouter la contrainte pour la clé étrangère.
<div class="bloccode php copiable">
<div><samp>$table->integer("user_id");</samp></div>
<div>$table->foreign("user_id")->on("<dfn data-definition="Le nom de la table liée">users</dfn>")->references("<dfn data-definition="La clé primaire de la table liée.">id</dfn>");</div>
</div>
</li>
<li>Tester : réinstallation la base de données.</li>
</ol>
</li>
<li id="migration_posts" data-video="mixyOb_Zuqc">
<h2>La migration des posts</h2>
<ol>
<li>Dans le terminal, lancer la migration <span class="commande copiable">php artisan migrate</span></li>
<li>Tester les commandes <span class="commande copiable">php artisan migrate:rollback</span> et <span class="commande copiable">php artisan migrate:reset</span>.</li>
<li>Analyser l'effet de ces commandes sur les tables dans <cite class="app">SQLite Browser</cite>.</li>
<li>Décommenter ou ajouter la migration dans le controller et tester.</li>
<li>Ouvrir le fichier de migration des users qui se trouve dans le dossier <span class="fichier">/database/migrations/</span></li>
<li>Ajouter la création des champs supplémentaires du modèle : "prenom", "nom", "tel", "adresse", "ville", "province", "codepostal" et "citation"
<div class="bloccode php copiable">
<div><samp>$table->increments('id');</samp></div>
<div><samp>$table->string('name');</samp></div>
<div><samp>$table->string('email')->unique();</samp></div>
<div><samp>$table->string('password');</samp></div>
<div>$table->string("prenom");</div>
<div>$table->string("nom");</div>
<div>$table->string("tel");</div>
<div>$table->string("adresse");</div>
<div>$table->string("ville");</div>
<div>$table->string("province");</div>
<div>$table->string("codepostal");</div>
<div>$table->text("citation");</div>
<div><samp>$table->rememberToken();</samp></div>
<div><samp>$table->timestamps();</samp></div>
</div>
</li>
<li>Voir le <a href="https://learninglaravel.net/cheatsheet/#schema" target="_blank">cheatsheet sur les <var>Schema</var></a> pour le types de données.</li>
<li>Ajouter les champs de la migration des posts.
<div class="bloccode php copiable">
<div><samp>$table->increments('id');</samp></div>
<div>$table->integer("user_id");</div>
<div>$table->string("titre");</div>
<div>$table->text("contenu");</div>
<div><samp>$table->timestamps();</samp></div>
</div>
</li>
<li>Ajouter la contrainte pour la clé étrangère.
<div class="bloccode php copiable">
<div><samp>$table->integer("user_id");</samp></div>
<div>$table->foreign("user_id")->on("<dfn data-definition="Le nom de la table liée">users</dfn>")->references("<dfn data-definition="La clé primaire de la table liée.">id</dfn>");</div>
</div>
</li>
<li>Tester : réinstallation la base de données.</li>
</ol>
</li>
<li id="seeder" data-video="Laidlp3N7GE">
<h2>Le seeder</h2>
<ol>
<li>Décommenter ou ajouter le seeder dans le controller et tester.</li>
<li>Ouvrir le fichier <span class="fichier">/database/seeders/DatabaseSeeder.php</span></li>
<li>Dans la méthode <var>run</var> créer un user bidon et le sauvegarder.
<div class="bloccode php copiable">
<div>$user = User::fake();</div>
<div>$user->save();</div>
</div>
</li>
<li>En haut du fichier, ajouter l'instruction <var>use</var> pour les modèles <var>User</var> et <var>Post</var>.
<div class="bloccode php copiable">
<div>use App/User;</div>
<div>use App/Post;</div>
</div>
</li>
<li>Tester et constater l'erreur d'intégrité.</li>
<li>Ouvrir le fichier du model <var>User</var>.</li>
<li>Ajouter les valeurs pour les données <var>name</var> et <var>password</var>.
<div class="bloccode php copiable">
<div><samp>$resultat->nom = $f->lastName();</samp></div>
<div>$resultat->name = str_slug($resultat->prenom.$resultat->nom, '');</div>
<div>$resultat->password = str_slug($resultat->prenom.$resultat->nom, '');</div>
<div><samp>$resultat->email = $resultat->name.'@'.$f->domain();</samp></div>
</div>
</li>
<li>Ajouter une boucle pour créer plusieurs users.</li>
<li>Tester et regarder le résultat dans <cite class="app">SQLite Browser</cite>.</li>
</ol>
</li>
<li id="seeder_posts" data-video="NuFsYXJpxNQ">
<h2>Ajout de posts aux users</h2>
<ol>
<li>Copier la méthode <var>fake</var> dans le model <var>Post</var> et l'adapter avec les données <var>titre</var> et <var>contenu</var>.</li>
<li>Ajouter le paramètre <var>$user_id</var> et la donnée correspondante de l'objet.
<div class="bloccode php copiable">
<div>static public function fake($user_id) {</div>
<div> $f = \Faker\Factory::create("fr_CA");</div>
<div> $resultat = new self();</div>
<div> $resultat->user_id = $user_id;</div>
<div> $resultat->titre = $f->text();</div>
<div> $resultat->contenu = $f->paragraph();</div>
<div> return $resultat;</div>
<div>}</div>
</div>
</li>
<li>Dans la boucle des users, ajouter une autre boucle qui crée plusieurs posts associés au user.
<div class="bloccode php copiable">
<div>for ($i = 0; $i < 10; $i += 1) {</div>
<div> $user = User::fake()</div>
<div> $user->save()</div>
<div> for ($j = 0; $j < 10; $j += 1) {</div>
<div> $post = Post::fake($user->id)</div>
<div> $post->save()</div>
<div> }</div>
<div>}</div>
</div>
</li>
<li>Ajuster la boucle des posts pour avoir un nombre d'itérations aléatoire.
<div class="bloccode php copiable">
<div><b>$nb = rand(0, 10);</b></div>
<div><em>for ($j = 0; $j < </em><b>$nb</b><em>; $j += 1) {</em></div>
</div>
</li>
<li>Tester et regarder le résultat dans <cite class="app">SQLite Browser</cite>.</li>
</ol>
</li>
<li id="affichage_index" data-video="SQAi1WMNeoc">
<h2>L'affichage des données</h2>
<ol>
<li>Dans l'action <span class="controller">Usercontroller@index</span>, remplacer la boucle par l'appel au model.
<div class="bloccode php copiable">
<div><del>$users = [];</del></div>
<div><del>for ($i = 0; $i < 10; $i += 1) {</del></div>
<div> <del>$users[] = User::fake();</del></div>
<div><del>}</del></div>
<div>$users = User::all();</div>
</div>
</li>
<li>Tester. Dire WOW!</li>
<li>Faire trier la requête : <span class="php copiable">$users = User::orderBy('nom')->get();</span></li>
<li>Voir le <a href="https://learninglaravel.net/cheatsheet/#eloquent" target="_blank">cheatsheet sur les <var>Model</var></a> pour les commandes possibles.</li>
</ol>
</li>
<li id="param_adresse" data-video="Qv-VClt6sGk">
<h2>Le paramètre d'adresse</h2>
<ol>
<li>Tester l'adresse <span class="fichier">http://localhost:8000/users/1</span></li>
<li>Ajouter la route équivalente actionnant l'action <span class="controller">UserController@show</span></li>
<li>Remplacer le <span class="string">1</span> par le paramètre d'adresse <span class="string">{id}</span></li>
<li>Dans l'action <span class="controller">Usercontroller@show</span>, récupérer le user dont le id est <span class="string">1</span> : <span class="php copiable">$user = User::find(1);</span></li>
<li>Faire retourner la valeur du paramèter <var>$id</var> à l'affichage : <span class="php copiable">return $id;</span></li>
<li>Remplacer le <span class="string">1</span> pas le paramètre de la méthode <span class="string">$id</span></li>
<li>Tester et constater l'affichage du <span class="string">1</span> puis changer la valeur. On peut même mettre un mot et il s'affichera.</li>
<li>Remettre l'adresse originale.</li>
<li>Dans l'action <span class="controller">Usercontroller@show</span>, récupérer le user dont le id correspound au paramètre <var>$id</var> : <span class="php copiable">$user = User::find($id);</span></li>
<li>Faire retourner le <var>$user</var> à l'affichage : <span class="php copiable">return $user;</span></li>
<li>Tester et constater l'affichage du JSON du user. Tester l'adresse avec d'autres entiers.</li>
<li>On pourrait laisser ainsi, mais on ajoute une autre fonctionnalité Laravel...</li>
<li>Dans la route, changer le <span class="string">id</span> pour <span class="string">user</span>.</li>
<li>Dans le controller, changer la déclaration du paramètre pour <span class="php"><samp>public function show(</samp><b>User $user</b><samp>) {</samp></span></li>
<li>Mettre en commentaire (ou supprimer) l'instruction avec <var>find</var>.</li>
<li>Tester... Ça fonctionne!</li>
</ol>
</li>
<li id="view_show" data-video="YOvB3P4XhXI">
<h2>La view show</h2>
<ol>
<li>Dans l'action <span class="controller">Usercontroller@show</span>, faire retourner le <var>$user</var> à l'affichage en utilisant la view <span class="view">users.show</span> : <span class="php copiable">return view('users.show', ['user', $user]);</span>.</li>
<li>Créer la view <span class="view">users.show</span> et y mettre le contenu de la view <span class="view">users.index</span>.</li>
<li>Supprimer la boucle.</li>
<li>Tester et constater la disparition de l'interface...</li>
</ol>
</li>
<li id="url_view" data-video="t-CKjzLvBCA">
<h2>Les adresses dans les <cite>view</cite></h2>
<ol>
<li>Ouvrir la view de la page maîtresse (<span class="view">interface.index</span>).<span class="view">users.show</span> et remplacer l'URL vers la feuille de style par la commande <span class="blade">asset</span> : <span class="blade copiable">{{asset('style.css')}}</span>.</li>
<li>Tester. L'interface devrait être partiellement revenue.</li>
<li>Répéter pour toutes les adresses qui mènent vers un fichier du dossier <span class="fichier">public</span> : <span class="fichier">.css</span>, <span class="fichier">.js</span>, les images...</li>
<li>Voir le <a href="https://learninglaravel.net/cheatsheet/#urls" target="_blank">cheatsheet sur les <var>URL</var></a> pour les autres commandes possibles.</li>
</ol>
</li>
<li id="url_action" data-video="XcrqwJfPouU">
<h2>Les adresses vers des actions</h2>
<ol>
<li>Ouvrir la view <span class="view">interface.menu</span>.</li>
<li>Repérer le lien qui pointe vers la page d'accueil et remplacer <span class="string">index.html</span> par <span class="string">/</span></li>
<li>Changer le texte du prochain lien pour <em class="string">Liste des usagers</em> et son href pour <span class="blade copiable">{{action("UserController@index")}}</span>.</li>
<li>Tester et regarder les adresses résultantes des 2 liens.</li>
</ol>
</li>
<li id="url_details" data-video="44fo6twDhR0">
<h2>Le lien vers la page de détails</h2>
<ol>
<li>Dupliquer la route <span class="string">/</span> et faire pointer la deuxième vers <span class="string">/users</span>. Regarder les adresses résultantes.</li>
<li>Dans la view <span class="view">users.index</span> ajouter une lien au titre avec le href <span class="blade">{{action("UserController@show")}}</span>. Tester et constater l'adresse l'erreur.</li>
<li>Tester les adresses suivantes et regarder les adresses résultantes
<div class="blade copiable">{{action("UserController@show", ['id'=>$user->id])}}</div>
<div class="blade copiable">{{action("UserController@show", ['id'=>$user->id, age=>99])}}</div>
<div class="blade copiable">{{action("UserController@show", [$user->id])}}</div>
<div class="blade copiable">{{action("UserController@show", [$user])}}</div>
<div class="blade copiable">{{action("UserController@show", $user)}}</div>
</li>
</ol>
</li>
<li id="posts_index" data-video="iYUwe99a8Xc">
<h2>Afficher tous les posts</h2>
<ol>
<li>Modifier le menu (view <span class="view">interface.menu</span>) pour ajouter <span class="string">Liste des articles</span> qui pointe vers l'action <span class="controller">PostController@index</span>.</li>
<li>Ajouter la route qui pointe vers l'adresse <span class="string">/posts</span> et qui utilise l'action <span class="controller">index</span> du controller <span class="controller">PostController</span>.</li>
<li>Dans l'action du controller, récupérer tous les posts dans la variable <var>$posts</var>.</li>
<li>Appeler la view <span class="view">posts.index</span> en lui envoyant les posts.</li>
<li>Faire afficher une simple liste avec les titres des posts avec un lien.
<div class="bloccode php copiable">
<div><ul></div>
<div>@foreach($posts as $post)</div>
<div> <li></div>
<div> <a href="{{action('PostController@show', $post)}}"></div>
<div> {{$post->titre}}</div>
<div> </a></div>
<div> par <a href="{{action('UserController@show', $post-><dfn data-definition="Un model lié.">user</dfn>)}}"></div>
<div> {{$post->user-><dfn data-definition="Une donnée virtuelle">nomComplet</dfn>}}</div>
<div> </a></div>
<div> </li></div>
<div>@endforeach</div>
<div></ul></div>
</div>
</li>
<li>Ne pas tester (ou bien tester et constater l'erreur). On doit lier les models.</li>
</ol>
</li>
<li id="liaisons" data-video="Y1QvEYhdFhg">
<h2>Lier les models</h2>
<ol>
<li>Ouvrir les models <var class="model">User</var> et <var class="model">Post</var>.</li>
<li>Dans <var>Post</var>, ajouter la relation <var>belongsTo</var> pour le user :
<div class="bloccode php copiable">
<div>public function user() {</div>
<div> return $this->belongsTo('<dfn data-definition="Le model qui représente le user (auteur) du post.">App\User</dfn>');</div>
<div>}</div>
</div>
</li>
<li>Dans <var class="model">User</var>, ajouter la relation <var>hasHany</var> pour les posts :
<div class="bloccode php copiable">
<div>public function posts() {</div>
<div> return $this->hasMany('<dfn data-definition="Le model qui représente les posts de l'auteur.">App\Post</dfn>');</div>
<div>}</div>
</div>
<p>Faire attention au pluriel du mot <var>post<b>s</b></var>.</p>
</li>
<li>Encore dans le model <var class="model">User</var> ajouter la donnée virtuelle (calculée) <var>nomAdmin</var> qui génère <span class="string">Raté, Rita</span> :
<div class="bloccode php copiable">
<div>public function get<dfn data-definition="Le nom de la donnée avec une majuscule initiale.">NomAdmin</dfn>Attribute() {</div>
<div> return $this->nom . ", " . $this->prenom;</div>
<div>}</div>
</div>
</li>
<li>Ajouter également la donnée virtuelle (calculée) <var>nomComplet</var> qui génère <span class="string">Rita Raté</span>.</li>
<li>On peut également ajouter une donnée virtuelle qui retourne le nombre d'articles de cet auteur :
<div class="bloccode php copiable">
<div>public function get<var>NbPosts</var>Attribute() {</div>
<div> return $this->posts->count();</div>
<div>}</div>
</div>
</li>
</ol>
</li>
<li id="posts_show" data-video="0H35n6dZ4tk">
<h2>Afficher un seul post</h2>
<ol>
<li>Ajouter l'interface à la view index.</li>
<li>Ajouter la route qui pointe vers l'adresse <span class="string">/posts/{post}</span> et qui renvoie à l'action <span class="controller">show</span> du controller <span class="controller">PostController</span>.</li>
<li>Adapter l'action du controller afin de recevoir un <var>$post</var> et non un <var>$id</var> (voir <span class="controller">UserController</span>).</li>
<li>Appeler la view <span class="view">posts.show</span> en lui envoyant le post.</li>
<li>Créer la view <span class="view">posts.show</span>.</li>
<li>Faire appel au component <span class="view">interface.post</span>.</li>
<li>Fournir les informations pour les slots <string>titre</string> et <string>contenu</string></li>
<li>Déplacer la balise <span class="string">div.meta</span> de la view <span class="view">interface.post</span> vers <span class="view">post.show</span></li>
<li>Adapter le lien vers l'auteur :
<div class="bloccode blade copiable">
<div><a href="{{action('UserController@show', $post->user)}}"></div>
<div> {{$post->user->nomComplet}}</div>
<div></a></div>
</div>
</li>
<li>Faire afficher la date de modification du post.</li>
</ol>
</li>
<li id="posts_user" data-video="w9p9FSZKo8A">
<h2>Les posts d'un user</h2>
<ol>
<li>Suivre la vidéo</li>
</ol>
</li>
</ol>
</div>
</div>
</body>
</html>