• Aucun résultat trouvé

LARAVEL (8-2021) – FRAMEWORK PHP 3

N/A
N/A
Protected

Academic year: 2022

Partager "LARAVEL (8-2021) – FRAMEWORK PHP 3"

Copied!
68
0
0

Texte intégral

(1)

Laravel – P3 - page 1/68

LARAVEL (8-2021) – FRAMEWORK PHP 3

SOMMAIRE

Sommaire ... 1

Etape 3 ... 5

0 - Bilan des commandes des étapes précédentes et objectifs de l’étape 3... 5

Principe du document ... 5

Objectifs de l’étape 3 ... 5

Bilan des commandes des étapes précédentes ... 5

Commandes ... 5

Fichier manipulés ... 5

Reconstruction complète du projet de départ ... 6

Etape 1 : création ... 6

Etape 2 – 1 : première migration ... 6

Etape 2 – 2 : package ui ... 7

Etape 2 – 3 : route hello ... 7

Etape 2 – 4 : creation d’une route apropos et d’un contrôleur pour la route apropos ... 8

Etape 2 – 5 : creation de la vue pour la route apropos ... 8

Etape 2 – 6 : creation de la vraie vue de la route apropos ... 9

Etape 2 – 7 : petits paramétrages ...10

Etape 2 – 8 : factorisation du code ...10

Etape 2 – 9 : Changer la page d’accueil ...11

Etape 2 – 10 : Bilan et livraison ...12

Projet de départ... 13

VS Code – PHP – Laravel ... 14

PHP ...14

Laravel ...14

1 – Mettre à jour la page d’accueil ...15

Objectifs ... 15

Technique 1 : on change du vue « welcome » ... 15

Technique 2 : on change la vue de la route « / » ... 15

Technique 3 : on redirige la route « / » vers la route « apropos » ... 15

2 – Ajouter des tables dans la BD avec « artisan make :migration » (v7) ...16

Présentation ... 16

Documenation Laravel ... 16

Différences de version ... 16

Création d’une table avec une migration ... 17

Objectif...17

Création d’une migration ...17

Fichier créé : database / migration ...17

Création de la table ...18

Suppression de la table ...18

Variante syntaxique ...18

Consulter les migrations ...19

Supprimer une migration non exécutée ...19

Exécuter une migration ...20

Annuler une migration ...22

Ajouter des attributs dans la table todos – technique 1 ...23

Ajouter des attributs dans la table todos – technique 2 ...24

Bilan des commandes de migration ... 25

(2)

Laravel – P3 - page 2/68

Artisan et le DDL ...25

Toutes les commandes migrate ...25

DDL table ...25

Type des colonnes...25

Index, unique, clé étrangère ...25

Toutes les commandes ...25

Exercices ... 26

Installer la table todos comme présentée dans le chapitre ...26

3 – Création d’un modèle et de données factices avec Eloquent (v8)...27

Eloquent, l’ORM Laravel ... 27

Généralités ...27

Eloquent et les modèles ...27

Le modèle App\Models\User ... 28

App\Models ...28

Convention de nommages des tables Laravel ...28

Attribute $fillable ...28

Créer le modèle Todo ... 29

A ce stade, la table todos a déjà été créée : ...29

Créer la classe du modèle ...29

Mettre à jour le modèle Todo ...29

Créer des fausses données ... 30

Principes ...30

Test ...30

Création d’une factory pour le modèle Todo ...31

Creation de la TodoFactory...32

Utilisation de la TodoFactory ...32

4 – Création d'un contrôleur de ressources (v9-11) ...33

Mise en place d'un controller de ressources... 33

Présentation ...33

Précision sur le contrôleur de resource ...33

php artisan make:controller --help ...34

Création des routes ... 35

Nouvelle syntaxe pour les routes ...35

Test de la route : http://127.0.0.1:8000/todos ...35

Comment afficher les données de la table todos ? ... 36

Version debug ...36

Version plus stylée ...37

Variantes de code ...38

Affichage HTML : ...39

Ajout d’un filtre : done=0...39

Affichage avec Layout et Bootstrap... 40

Situation ...40

On va mettre ça dans des composants bootstrap ...40

Version sans blade avec seulement du PHP : ...40

Installation et utilisation d’un plugin bootstrap ...41

Exemples de tuto bootstrap : ...41

Bootstrap ou HTML 5 ? ...42

Amélioration de la présentation : système de pagination v11 ... 43

Problèmatique de la pagination ...43

Technique de pagination ...43

5 –Boutons de gestion des todos v12-13 ...44

Menu principal : gestions des todos... 44

Objectif...44

Principes de résolution ...44

Eléments techniques...44

Menu principal : ajouter une todo ... 45

Vue : views/todos/index.php...45

(3)

Laravel – P3 - page 3/68

Route : route('todos.create') ...45

Menu principal : todos ouvertes (undone) et todos terminées (done) ... 46

Vue : views/todos/index.php...46

Route : création des routes ('todos.done') et ('todos.undone') ...46

Contrôleurs : on crée des contrôleurs vides ...46

Afficher toutes les todos : petits codages Blade ... 47

Un peu de SQL Laravel ... 48

Solution Bootstrap ... 49

Codage minimaliste : ...49

Codage plus lourd avec complétion automatique:...49

Ajout des 2 autres boutons par copier-coller ...49

Afficher toutes les todos ...49

Documentation Bootstrap ...49

Reste à coder l'ajout de la todo. ... 50

Controller ...50

Vue ...51

L’enregistrement en BD : la méthode store ...52

Modification de la BD : migration ...53

Version Bootstrap du formulaire ... 55

Principes : ...55

Réalisation avec auto-complétion : ...55

Code Bootstrap ...56

Petites amélirations visuelles – usage de Blade v13 ... 57

Objectifs ...57

Solution ...57

Syntaxe Blade ...57

6 –Boutons d’action sur chaque todo v14 ...58

Les boutons d'action v14 ... 58

Objectif...58

Principes de résolution ...58

Eléments techniques...58

Code HTML basique ... 59

Code HTML, dans le foreach ...59

Code CSS, dans un <style> ...59

done et undone ... 60

routes ...60

vue...60

controleur ...60

destroy ... 61

routes ...61

vue...61

controleur ...61

Bootstrap ... 62

Codage minimaliste : ...62

Editer v15 ... 63

Route ...63

La fonction edit() du TodoController ...63

La vue edit.blade.php ...64

La méthode update() du TodoController...65

7 –Bilan et menu pratique ...66

Bilan ... 66

Accès direct à la barre des todos quand on se connecte ... 66

App/Providers/RouteServiceProvider.php ...66

App/Http/Controllers/Auth/LoginController...66

Test ...66

Menu de gauche ... 67

(4)

Laravel – P3 - page 4/68

Objectif...67

Layout ...67

App/Providers/RouteServiceProvider.php ...67

Livraison ... 67

Documentation ... 68

Controller ...68

Route ...68

Vue ...68

Migration ...68

ORM Eloquent ...68

(5)

Laravel – P3 - page 5/68

ETAPE 3

0 - Bilan des commandes des étapes précédentes et objectifs de l’étape 3

Principe du document En bleu : les parties à réaliser.

Objectifs de l’étape 3

• On va installer un

Bilan des commandes des étapes précédentes

Commandes

• Installation du package ui

>php artisan config:cache # par prudence, on vide les caches

>php artisan cache:clear # par prudence, on vide les caches

>php artisan migrate

>php artisan ui bootstrap --auth // cf packagist.org

>npm install && npm run dev

• Lister les routes

>php artisan route:list

• Création d’un contrôleur pour la route a-propos

> php artisan make:controller AproposController

• Syntaxe Blade

Le PHP est entre {{ }}

Le PHP est précédé de @

Fichier manipulés

• Création d’une route « apropos »

 routes / web.php

• Création d’un contrôleur pour la route

 App / Http / Controllers / AproposController.php

• Création d’une vue pour le contrôleur : fichier blade

 ressources / views / apropos / index.blade.php

(6)

Laravel – P3 - page 6/68

Reconstruction complète du projet de départ

Etape 1 : création

• On va recréer une application en partant de rien (from scratch : FS) pour le début de l’étape 3 (FS3)

>composer create-project laravel/laravel maTodolistFS3

• On démarre un serveur de BD et on crée la BD matodolistFS3

mysql>create database matodolistFS3

• On met à jour le fichier .env

DB_DATABASE=matodolistFS3 DB_USERNAME=root

DB_PASSWORD=

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

 Ca marche !

 On arrête le serveur laravel.

Etape 2 – 1 : première migration

• On va faire une première migration.

• On met à jour le fichier App/Providers/AppServicesProvider.php :

• On ajoute la ligne suivante juste après le 1er use :

use Illuminate\Support\Facades\Schema; // juste après le 1er use

• On ajoute la ligne suivante dans la fonction boot

Schema::defaultStringLength(191); // dans la fonction boot

• On passe les commandes suivantes :

>php artisan config:cache # par prudence, on vide les caches

>php artisan cache:clear # par prudence, on vide les caches

>php artisan migrate

Migration table created successfully.

Migrating: 2014_10_12_000000_create_users_table

Migrated: 2014_10_12_000000_create_users_table (25.02ms) Migrating: 2014_10_12_100000_create_password_resets_table

Migrated: 2014_10_12_100000_create_password_resets_table (18.06ms) Migrating: 2019_08_19_000000_create_failed_jobs_table

Migrated: 2019_08_19_000000_create_failed_jobs_table (21.58ms)

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

 Ca marche !

 On arrête le serveur laravel.

(7)

Laravel – P3 - page 7/68 Etape 2 – 2 : package ui

• On va ajouter le package ui

>composer require laravel/ui --dev

>php artisan ui bootstrap --auth // cf packagist.org

>npm install && npm run dev

>npm install && npm run dev // 2 fois, la première fois bogue

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

 Ca marche !

 On arrête le serveur laravel.

• On crée un utilisateur : toto, toto@gmail.com, laravelmdp, laravelmdp

• On vérifie la présence de l’utilisateur dans la BD :

mysql>select id, name, email from users;

+----+---+---+

| id | name | email | +----+---+---+

| 1 | toto | toto@gmail.com | +----+---+---+

Etape 2 – 3 : route hello

• On va ajouter une route « hello » : ça ne sert à rien, c’est juste pour voir !

• Dans le fichier de routes : routes/web.php, on ajoute à la fin :

Route::get('/hello/{name?}', function($name='nobody'){

return '<h1 style="color:blue" >hello '.$name.'</h1>';

});

• On affiche les routes :

>php artisan route:list

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/hello/toto

 Ca marche !

 On arrête le serveur laravel.

(8)

Laravel – P3 - page 8/68

Etape 2 – 4 : creation d’une route apropos et d’un contrôleur pour la route apropos

• Dans le fichier de routes : routes/web.php, on ajoute à la fin :

Route::get(

'/apropos',

[App\Http\Controllers\AproposController::class, 'index']

)->name('apropos');

• Création du contrôleur :

>php artisan make:controller AproposController

 Ca crée le fichier : App /Http /Controllers /AproposController.php

• Ecriture de la méthode index : l’appel à la vue

 Dans la classe AproposController, on ajoute la méthode index () :

public function index() {

return view('apropos.index'); # fichier apropos/index.blade.php }

Etape 2 – 5 : creation de la vue pour la route apropos

• Création d’une vue de test :

 On crée à la main le fichier ressources/views/apropos/index.blade.php

 Création d’une vue de test :

• Dans ce fichier on met :

<h1 style="color:red">Premier test de la route apropos</h1>

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

 On arrête le serveur laravel.

(9)

Laravel – P3 - page 9/68 Etape 2 – 6 : creation de la vraie vue de la route apropos

• On crée une copie ressources/views/apropos/index.blade.php :

 ressources/views/apropos/index.blade-copie.php

• Dans le fichier : ressources/views/apropos/index.blade.php

 On recopie le contenu de ressources/views/layout/app.blade.php

 On remplace :

<main class="py-4">

@yield('content')

</main>

 Par (chargeable <ici>) :

<main class="contenair">

<div class="jumbotron jumbotron-fluid">

<div class="container">

<h1 class="display-4">Your todolist with Laravel !</h1>

<p class="lead">A very simple todolist application to learn Laravel.</p>

<p>Lorem ipsum dolor sit amet consectetur adipisicing elit.

Expedita eos provident mollitia.

Nesciunt praesentium doloribus aliquam voluptatem aperiam nisi molestias culpa voluptate soluta?

Nemo incidunt exercitationem similique sequi id temporibus?</p>

<p class="bg-warning p-4"><span class="badge badge-primary mx-2">New</span>Lorem ipsum dolor sit

amet

consectetur, adipisicing elit. Optio, laudantium culpa facilis alias nihil ad autem. Libero cupiditate tempore, ipsa consectetur maxime quae quis

rem dignissimos nihil nisi necessitatibus voluptas.</p>

</div>

</div>

</main>

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

 On arrête le serveur laravel.

(10)

Laravel – P3 - page 10/68 Etape 2 – 7 : petits paramétrages

• Dans le .env, on met : APP_NAME="Laravel todolist" // avec des guillemets ou apostrophes.

• Dans ressources/views/apropos/index.blade.php :

 Cherchez « navbar-light bg-white » et remplacez par « navbar-dark bg-primary ».

 Cherchez « bg-warning » » et remplacez par « bg-success ».

 Cherchez « badge-primary » » et remplacez par « badge-warning».

• On démarre l’application pour vérifier que ça marche :

>php artisan cache:clear // plus sur pour la prise en

>php artisan config:clear // compte du .env

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

 On arrête le serveur laravel.

Etape 2 – 8 : factorisation du code

• On crée une copie ressources/views/apropos/index.blade.php :

 ressources/views/apropos/index.blade-non-factorise.php

• Dans ressources/apropos/index.blade.php

 On ne garde que la div dans le main : on peut supprimer tout le reste qui correspond au layout (on ne garde pas le main).

 Au début du fichier on écrit :

@extends('layouts.app')

@section('content')

 on ferme avec @endsection

@section('content')

• Dans le fichier layout/app.blade.php

 <main class=""> : il faut supprimer py-4 (il contient un padding-top).

 <nav class="navbar ... navbar-dark bg-primary ..."> : il faut remplacer navbar-light bg- white par navbar-dark bg-primary

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

 On arrête le serveur laravel.

(11)

Laravel – P3 - page 11/68 Etape 2 – 9 : Changer la page d’accueil

• On veut que l’adresse http://127.0.0.1:8000 nous amène sur la route apropos.

• Pour ça, on modifie la route « / » dans le fichier routes/web.php : on lui passe la vue

« index.apropos ».

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• Ca marche ! On arrive directement sur la page apropos. A noter que la route apropos fonctionne toujours : http://127.0.0.1:8000/apropos

(12)

Laravel – P3 - page 12/68 Etape 2 – 10 : Bilan et livraison

• Le projet pèse actuellement 178,9 MO

• Pour livrer on peut effectuer des « clear » avec artisan : ça fait du ménage dans les caches.

 En l’occurrence, c’est inutile puisqu’on a rien fait de spécial.

php artisan config:clear php artisan cache:clear php artisan clear-compiled php artisan view:clear php artisan optimize:clear php artisan route:clear

• Pour livrer on peut supprimer :

− vendor

− node_modules

− public/js

− package-lock.json

− composer.lock

− storage/logs

• On obtient un projet à 562 KO !

• On peut refabriquer le projet :

Composer update

npm install && npm run dev

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

(13)

Laravel – P3 - page 13/68

Projet de départ

• On peut réinstaller un projet « from scratch » (chapitre précédent).

• Ou charger une version de départ de l’étape 3 est accessible <ici>.

 Cette version correspond à l’installation « from scratch » avec une BD appelée matodolistFS3.

• Pour faire fonctionner cette version :

 Créer la BD

mysql>create database matodolistFS3

 Mettre à jour le fichier .env si nécessaire

DB_DATABASE=matodolistFS3 DB_USERNAME=root

DB_PASSWORD=

 Mettre à jour les dépendances

composer update

npm install && npm run dev

npm install && npm run dev // 2 fois, pas forcément

 Faire la migration

php artisan migrate

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

• On teste la route : http://127.0.0.1:8000/apropos

 Ca marche !

 On peut ajouter un utilisateur.

 On peut changer le texte de la page apropos :

 Dans ressources/views/apropos/index.blade.php

 Écrivez par exemple : Votre liste de todos avec Laravel !

(14)

Laravel – P3 - page 14/68

VS Code – PHP – Laravel

PHP

• Installer PHP Intelephense

Laravel

• Installer Laravel Artisan

• On peut ouvrir un terminal pour démarrer par exemple > php artisan serve

• On peut faire bouton droit / palette de commande pour accéder à des commandes artisan.

(15)

Laravel – P3 - page 15/68

1 – Mettre à jour la page d’accueil

Objectifs

• On va adapter notre page d’accueil : la route http://127.0.0.1:8000 à notre application.

• On va reprendre notre page apropos et la mettre sur notre page d’accueil.

Technique 1 : on change du vue « welcome »

• La page d’accueil correspond au fichier : ressources/views/layout/welcome.blade.php.

• On fait une copie de ressources/views/welcome.blade.php pour garder une sauvegarde.

• Ensuite, dans fichier ressources/views/welcome.blade.php on copie de code du fichier ressources/views/apropos/index.blade.php.

• On démarre l’application pour vérifier que ça marche :

>php artisan serve

Starting Laravel development server: http://127.0.0.1:8000

 Ca marche !

• On peut maintenant mettre à jour le contenu de la page d’accueil (technique HTML et bootstrap).

 Par exemple : Ma liste de todos avec Laravel.

Technique 2 : on change la vue de la route « / »

• Actuellement, la route / amène à la vue « welcome ».

Route::get('/', function () { return view('welcome');

});

• On l’amène à la vue apropos.indes :

Route::get('/', function () { return view('apropos.index');

});

Technique 3 : on redirige la route « / » vers la route « apropos »

• Actuellement, la route / amène à « welcome ».

Route::get('/', function () { return view('welcome');

});

• On l’amène à la route « apropos »

Route::get('/', function () {

return redirect()->route('apropos');

});

• Du coup le chemin http://127.0.0.1:8000 se transforme en http://127.0.0.1:8000/apropos

• https://laravel.com/docs/8.x/routing#redirect-routes

(16)

Laravel – P3 - page 16/68

2 – Ajouter des tables dans la BD avec « artisan make :migration » (v7)

Présentation

• On peut faire du DDL avec l’outil artisan male:migration

 Créer / Modifier / Supprimer des tables

 Créer / Modifier / Supprimer des attributs

• On peut ajouter ces modifications étape par étape : chaque étape s’appelle une migration.

• On peut gérer ces migrations :

 Ajouter

 Supprimer

 Annuler

 Lister

• La gestion des migrations correspond à la commande :

php artisan make:migration

• Aide pour cette commande

php artisan make:migration --help

• Le DDL se fera en écrivant des fichiers PHP correspondant au DDL-SQL.

Documenation Laravel

• Migration : https://laravel.com/docs/8.x/migrations

• Création de table : https://laravel.com/docs/8.x/migrations#creating-tables

• Création de colonnes : https://laravel.com/docs/8.x/migrations#creating-columns

• Création de clés étrangères : https://laravel.com/docs/8.x/migrations#foreign-key-constraints

• Etc.

Différences de version

• A noter que la syntaxe a pu un peu évoluer en fonction des versions de Laravel.

(17)

Laravel – P3 - page 17/68

Création d’une table avec une migration

Objectif

• On veut créer une migration (une étape de DDL) pour créer la table des todos.

Création d’une migration

• Commande php artisan make:migration

>php artisan make:migration create_todos_table --create todos

 Le nom de la migration est conventionnel : « create_todos_table » : on précise ici qu’il s’agit de créer la table todos. Il faut donner un nom explicite.

 L’option « --create todos » permet de donner le nom « todos » à la table, sinon il va s’appeler « todos_table »

Fichier créé : database / migration

• Fichier créé : date_heure_nom_migration.php

 Par exemple : 2021_03_12_153313_create-todos-table

• Dans ce fichier : la class CreateTodosTable avec 2 méthodes :

 up() : pour créer les table : create()

 down() : pour supprimer la table : dropIfExist()

(18)

Laravel – P3 - page 18/68 Création de la table

• La méthode up() fait appel à la méthode Schema::create()

 id() permet de créer un id. On peut aussi utiliser bigIncrements()

 timestamps() permet de créer 2 attributs : created_at et updated_at.

Suppression de la table

• La méthode down() fait appel à la méthode Schema::dropIfExists()

 La méthode dropIfExists() va permettre de supprimer une table si elle existe.

Variante syntaxique

• On peut donner n’importe quel nom à la migration et rien d’autre :

>php artisan make:migration m1

Dans ce cas, les fonctions up() et down() sont créées avec rien dedans.

• On peut utiliser l’option « --table todos »

>php artisan make:migration m2 --table todos

Dans ce cas, les fonctions up() et down() sont créées avec un appel à Schema::table() et rien dedans. La méthode table permet de faire des mises à jour de table (un ALTER TABLE). Encore faut-il que la table existe.

(19)

Laravel – P3 - page 19/68 Consulter les migrations

• Pour consulter les migrations, on passe la commande :

>php artisan migrate:status

 Attention, le serveur de BD doit tourner !

+---+---+---+

| Ran? | Migration | Batch | +---+---+---+

| Yes | 2014_10_12_000000_create_users_table | 1 |

| Yes | 2014_10_12_100000_create_password_resets_table | 1 |

| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | +---+---+---+

 Colonne Run : est-ce que la migration a été exécutée

 Migration : nom de la migration

 Batch : numéro de la « transaction » de migration : les migrations qui ont été exécutées ensemble ont un même numéro. Les réalisations de migration sont numérotées de 1 à N.

• Après la création de la migration create_todos_table :

+---+---+---+

| Ran? | Migration | Batch | +---+---+---+

| Yes | 2014_10_12_000000_create_users_table | 1 |

| Yes | 2014_10_12_100000_create_password_resets_table | 1 |

| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |

| No | 2021_03_12_165402_create-todos-table | | +---+---+---+

 La nouvelle migration n’est pas exécutée. Elle n’a pas de numéro de transaction.

Supprimer une migration non exécutée

• Pour supprimer une migration non exécutée, il suffit de supprimer le fichier.

(20)

Laravel – P3 - page 20/68 Exécuter une migration

Migration :

• A ce stade, notre BD contient les tables suivantes : Mysql>show tables

+---+

| Tables_in_matodolist | +---+

| failed_jobs |

| migrations |

| password_resets |

| users | +---+

• Pour exécuter les migrations qui n’ont pas encore été exécutées (Run à No), on passe la commande suivante :

>php artisan migrate

Conséquences dans Laravel

>php artisan migrate:status

+---+---+---+

| Ran? | Migration | Batch | +---+---+---+

| Yes | 2014_10_12_000000_create_users_table | 1 |

| Yes | 2014_10_12_100000_create_password_resets_table | 1 |

| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |

| Yes | 2021_03_12_165402_create-todos-table | 2 | +---+---+---+

 Avec cette commande, les migrations nouvellement exécutées ont leur Run qui passe à Yes et récupère un numéro de Batch (2 en l’occurrence).

(21)

Laravel – P3 - page 21/68

Conséquences dans la BD

• A ce stade, notre BD contient les tables suivantes : Mysql>show tables

+---+

| Tables_in_matodolist | +---+

| failed_jobs |

| migrations |

| password_resets |

| todos |

| users | +---+

• La table todos a été créée par la méthode Schema::create()

• La table todos contient les attributs suivants : Mysql>desc todos ;

+---+---+---+---+---+---+

| Field | Type | Null | Key | Default | Extra | +---+---+---+---+---+---+

| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |

| created_at | timestamp | YES | | NULL | |

| updated_at | timestamp | YES | | NULL | | +---+---+---+---+---+---+

(22)

Laravel – P3 - page 22/68 Annuler une migration

Migration:

• Pour annuler la dernière migration, on passe la commande suivante :

>php artisan migrate:rollback

Conséquences dans Laravel

>php artisan migrate:status

+---+---+---+

| Ran? | Migration | Batch | +---+---+---+

| Yes | 2014_10_12_000000_create_users_table | 1 |

| Yes | 2014_10_12_100000_create_password_resets_table | 1 |

| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |

| No | 2021_03_12_165402_create-todos-table | | +---+---+---+

Conséquences dans Laravel

 A ce stade, notre BD contient les tables suivantes : Mysql>show tables

+---+

| Tables_in_matodolist | +---+

| failed_jobs |

| migrations |

| password_resets |

| users | +---+

 La table todos a été supprimée par la méthode Schema::dropIfExists()

(23)

Laravel – P3 - page 23/68 Ajouter des attributs dans la table todos – technique 1

• Pour le moment, on a créé automatique un id et des timestamps.

• On va ajouter d’autres attributs.

• L’objectif est d’obtenir cette table : todos

id int

created_at timestamp updated_at timestamp name string(100)

text texte

done booléen

• Création de colonnes : https://laravel.com/docs/8.x/migrations#creating-columns

• Dans la méthode Schema ::create() de la méthode up() de la migration, on rajoute :

Schema::create('todos', function (Blueprint $table) { ...

$table->string(‘name’, 100);

$table->text(‘description’);

$table->Boolean(‘done’);

• On crée la table :

>php artisan migrate

• On vérifie le status :

>php artisan migrate:status

 Le Run est à yes,

 Le Batch est à 2

• On vérifie sur le serveur de BD :

mysql>show tables mysql>desc todos

(24)

Laravel – P3 - page 24/68 Ajouter des attributs dans la table todos – technique 2

• Comment ajouter des colonnes à une table qui existe déjà ?

• On va créer une migration d’update : https://laravel.com/docs/8.x/migrations#updating-tables

• Au lieu d’avoir une fonction Schema ::create() on aura une fonction Schema ::table()

• On commence par créer la migration :

php artisan make:migration alter_todos_table --table todos

• Pour la méthode Schema ::table() de la méthode up() et down() de la migration, on écrit : Schema::table('todos', function (Blueprint $table) {

$table->string('name', 100);

$table->text('description');

$table->Boolean('done');

});

• Pour la méthode Schema ::table() de la méthode down() et down() de la migration, on écrit : Schema::table('todos', function (Blueprint $table) {

$table->dropColumn('name');

$table->dropColumn('description');

$table->dropColumn('done');

});

 https://laravel.com/docs/8.x/migrations#dropping-columns

(25)

Laravel – P3 - page 25/68

Bilan des commandes de migration

Artisan et le DDL

• Artisan et Laravel nous permettent de créer et modifier notre BD avec du code PHP.

• C’est très pratique car ça nous permet d’avancer le projet et de faire des mises à jour de la BD en fonction des besoins du projet.

• C’est adapté à la méthode AGILE.

Toutes les commandes migrate

>php artisan

>php artisan migrate

>php artisan migrate:status

>php artisan migrate:rollback

>php artisan make:migration –help

>php artisan make:migration

>php artisan make:migration create-todos-table --create todos

DDL table

• CREATE TABLE : create()

• ALTER TABLE : table()

• DROP TABLE : drop(), dropIfExists()

Type des colonnes

• https://laravel.com/docs/8.x/migrations#available-column-types

Index, unique, clé étrangère

• https://laravel.com/docs/8.x/migrations#indexes Toutes les commandes

• https://laravel.com/docs/8.x/migrations

(26)

Laravel – P3 - page 26/68

Exercices

Installer la table todos comme présentée dans le chapitre

• On utilisera 2 migrations comme dans le document.

(27)

Laravel – P3 - page 27/68

3 – Création d’un modèle et de données factices avec Eloquent (v8)

Eloquent, l’ORM Laravel

Généralités

• ORM : Object-Relational Mapping

• Un ORM permet de faciliter les relations entre les classes de notre application (object) et les tables de la base de données (relational).

• En général, les framework utilise un ORM.

• Laravel utilise l’ORM Eloquent : https://laravel.com/docs/8.x/eloquent

Eloquent et les modèles

• MVC : Modèle – Vue – Contrôleur.

• Le Modèle du MVC, c’est le Modèle des données. Il correspond aux tables de la BD.

• Eloquent va nous servir pour la mise en place et l’exploitation de la BD.

(28)

Laravel – P3 - page 28/68

Le modèle App\Models\User

App\Models

• Les modèles sont rangés dans App\Models.

• On trouve déjà le modèle User présent par défaut dès l’installation de base (composer create- project laravel/laravel monProjet).

• C'est une classe User qui correspond à la table users.

Convention de nommages des tables Laravel

 table : todos // minuscule au début, pluriel

 modèle : Todo // Majuscule au début, singulier

• On peut choisir ce qu'on veut, mais ce sera pratique d’appliquer cette convention.

Attribute $fillable

• Dans la classe App/Models/User, on trouve la définition d’un attribut $filable.

• Cet attribut permet de définir certains les attributs de la table : ceux qui correspondent à des champs de saisie pour lesquels le PHP gérera une protection des données particulière.

protected $fillable = [ 'name',

'email', 'password', ];

 https://laravel.com/docs/8.x/eloquent#mass-assignment

(29)

Laravel – P3 - page 29/68

Créer le modèle Todo

A ce stade, la table todos a déjà été créée :

+---+---+---+---+---+---+

| Field | Type | Null | Key | Default | Extra | +---+---+---+---+---+---+

| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |

| name | varchar(100) | NO | | NULL | |

| description | text | NO | | NULL | |

| done | tinyint(1) | YES | | 0 | |

| creator_id | bigint(20) | NO | | 0 | |

| affectedTo_id | bigint(20) | NO | | 0 | |

| affectedBy_id | bigint(20) | NO | | 0 | |

| created_at | timestamp | YES | | NULL | |

| updated_at | timestamp | YES | | NULL | | +---+---+---+---+---+---+

Créer la classe du modèle

• La commande php artisan make:modele permet de créer un nouveau modèle : php artisan make:model Todo

 On donne le nom du modèle : Todo

 avec --migration ou -m ça va créer la migration en même temps. Inutile dans ce cas : c’est déjà fait.

• Le modèle App/Models/Todo.php a été créé, à côté de User.

• On pourra créer des dossiers dans Models pour ranger nos modèles.

 Dans ce cas, il faudra changer le namespace : App\Models\TelDomaine

Mettre à jour le modèle Todo

• Pour le moment, la classe du modèle Todo, App\Models\Todo.php, c’est un template vide.

• A noter les couleurs de la coloration syntaxique.

• On applique le template du modèle User pour créer le $filable.

• name, description et done sont trois champs sont les champs de saisie de masse.

• On ajoute donc :

protected $fillable = [ 'name',

'description', 'done',

];

 On a besoin de rien d'autres pour le moment.

(30)

Laravel – P3 - page 30/68

Créer des fausses données

Principes

• On va pouvoir générer des fausses données qui vont nous permettre de tester notre application facilement.

• Pour ça, on utilse la commande « php artisan db:seed »

• Cette commande utilise la classe « databases/seed/DatabaseSeeder ».

 Dans cette classe, on trouve une méthode run et un exemple mis en commentaire :

 \App\Models\User::factory(5)->create();

• On utilise la methode de classe factory (usine) de la classe User. Ca nous ramène sur la classe UserFactory (c’est une convention propre à Laravel).

• La Factory définit les valeurs à mettre dans un tuple de la BD et fait référence à la classe User.

• On a donc l’enchainement suivant : de : databases/seed/DatabaseSeeder

à : databases/factories/UserFactory et : App/models/User

Test

• On peut tester en décommentant le factory des User dans la classe databases/seed/DatabaseSeeder :

public function run() {

\App\Models\User::factory(5)->create();

}

• Ensuite on passe la commande artisan :

>php artisan db:seed

• On vérifie la présence des données dans la BD mysql>select * from users \G

• On peut supprimer les données si on veut :

mysql>delete from users where id > 1;

(31)

Laravel – P3 - page 31/68 Création d’une factory pour le modèle Todo

• On va créer une factory (usine) pour le modèle Todo.

 Pour ça on va dupliquer la factory du modèle User.

• On a déjà : databases\factories\UserFactory pour le modèle User.

 La table users était la suivante :

+---+---+---+---+---+---+

| Field | Type | Null | Key | Default | Extra | +---+---+---+---+---+---+

| id | bigint(20) unsigned | NO | PR | NULL |auto_increment

| name | varchar(191) | NO | | NULL | |

| email | varchar(191) | NO | UNI | NULL | |

| email_verified_at | timestamp | YES | | NULL | |

| password | varchar(191) | NO | | NULL | |

| remember_token | varchar(100) | YES | | NULL | |

| created_at | timestamp | YES | | NULL | |

| updated_at | timestamp | YES | | NULL | | +---+---+---+---+---+---+

• La classe Factory définit comment vont être créées les données factices dans la BD.

• La méthode definition() permet cela : elle utilise un attribut « faker ».

 Les 5 champs non timestamp sont traités

 L’attribut « email_verified_at » est traité à part et mis à null

(32)

Laravel – P3 - page 32/68 Creation de la TodoFactory

• On dupplique la classe UserFactory en TodoFactory

• On met à jour : user devient todo

• On met à jour la méthode definition()

'name' => $this->faker->sentence(3), // 3 mots max 'description' => $this->faker->sentence(10), // 10 mots max 'done' => $this->faker->numberBetween(0,1), // 0 ou 1

 sentence(max) : génère des mots pour l’attributs. On fixe le nombre max.

 numberBetween permet de choisir un entier entre 2 valeurs

• Pas besoin de plus : la factorie est faite

Utilisation de la TodoFactory

• On revient dans database\seeders\DatabaseSeeders

• Dans le run, on duplique la factory des users et on l’adapte pour 25 Todo \App\Models\Todo::factory(25)->create();

• On peut lancer la commande : >php artisan db:seed

 Les données ont été générées.

• On peut vérifier dans la BD :

mysql>select * from todos \G

• On peut supprimer les données dans la BD : mysql>delete from todos \G

(33)

Laravel – P3 - page 33/68

4 – Création d'un contrôleur de ressources (v9-11)

Mise en place d'un controller de ressources

Présentation

• On sait créer nos données et nos modèles. On sait les alimenter en données factices.

• On veut pouvoir manipuler nos données indépendamment de l’application.

• Pour ça, on met en place un contrôleur de ressources (les ressources sont les données).

• Un contrôleur de ressources est un outil pour accéder à nos données indépendamment de l'application.

• https://laravel.com/docs/8.x/controllers#resource-controllers

• Ensuite il faudra des routes pour utiliser le contrôleur.

Précision sur le contrôleur de resource

• Pour chaque table, on a une classe.

• Pour chaque classe correspondant à une table, on aura un contrôleur particulier : on l’appelle contrôleur de ressources.

• Ce contrôleur aura une fonction index(), comme tous les contrôleurs, qui pourra retourner une vue.

• Mais il offre aussi des méthodes qui permettent de manipuler les données de la table :

 create()

 show()

 edit()

 update()

 destroy()

• Le pattern d’un contrôleur de ressources est le même pour toutes les classes du modèle :

 php artisan va fournir un outil pour fabriquer ce pattern.

 https://laravel.com/docs/8.x/controllers#actions-handled-by-resource-controller

(34)

Laravel – P3 - page 34/68 php artisan make:controller --help

• On sait déjà faire un contrôleur avec php artisan make :controler

• L’aide nous montre l’option --ressource (ou -r)

• On va donc passer la commande :

php artisan make:controller -r TodoController

• Ca génère le contrôleur App/Http/Controller/TodoController avec ses méthodes index(), create(), show(), edit(), update(), destroy().

• Ce contrôleur servira à notre application finale.

• Pour le moment, on veut un contrôleur de ressources avec ses routes.

(35)

Laravel – P3 - page 35/68

Création des routes

Nouvelle syntaxe pour les routes

• Dans le fichier routes\web.php, on ajoute une route « todos » pour le contrôleur de ressources.

• Nouvelle syntaxe : resource(‘route’, Controller ::class) use App\Http\Controllers\TodoController;

Route::resource('todos', TodoController::class);

 Cf documentation laravel : https://laravel.com/docs/8.x/controllers#resource-controllers

Test de la route : http://127.0.0.1:8000/todos

• La route existe mais la page est blanche (pas d'erreur 404).

• Chemin :

 Route::ressources('todos', 'TodoController')

 App\Http\Controllers\TodoController.index() : -> ne fait rien

-> On peut y mettre un echo 'hello world' ;

• Tout est prêt pour exploiter nos données.

(36)

Laravel – P3 - page 36/68

Comment afficher les données de la table todos ?

Version debug

Dans l’index du TodoController, à la place de l’echo

use App\Models\Todo; // à ne pas oublier : App majuscule !

public function index() {

// echo 'hello world';

$datas=Todo::all();

dd($datas);

}

 $datas est un tableau de données

 Todo c’est app\Models\Todo

 all() c’est un select de tous les tuples (pas de where).

 dd($datas) permet un affichage pratique type "console"

=> on comprend bien qu'on est dans une logique de debug et d'outils de debug

(37)

Laravel – P3 - page 37/68 Version plus stylée

• On transmet les données à un fichier blade

• Au lieu du dd($datas) on passe une vue :

return view('todos.index', compact('datas'))

 Compact(‘datas’) : le nom de la variable, sans $

• A ce stade :

 Route::ressources('todos', 'TodoController')

 App\Http\Controllers\TodoController.index()

=>ressources\views\todos\index.blade.php : n'existe pas encore

• On va donc créer la vue pour la route todos : ressources\views\todos\index.blade.php

• On reprend la syntaxe de la vue apropos :

@extends('layouts.app')

@section('content') hello world

@endsection

• Syntaxe blade :

 https://laravel.com/docs/8.x/blade

 https://laravel.com/docs/8.x/blade#the-loop-variable

• Code avec une boucle foreach de blade

@section('content')

@php // hello world @endphp @foreach($datas as $data) @php

// on met du php dans le html-blade dd($data);

@endphp @endforeach

@endsection

 dd($data) : le dd() fait quitter l’affichage : ça affiche le premier et ça s’arrête (comme un return).

(38)

Laravel – P3 - page 38/68 Variantes de code

@section('content') <h1>Hello world</h1>

@php

echo '<pre>'; print_r($datas); echo '</pre>';

@endphp

@foreach($datas as $data) @php

dd($data);

@endphp @endforeach

@endsection

On peut remplacer le blade par du php :

@section('content') <h1>Hello world</h1>

<?php

echo '<pre>'; print_r($datas[0]); echo '</pre>';

?>

<?php foreach($datas as $data){

dd($data);

} ?>

@endsection

(39)

Laravel – P3 - page 39/68 Affichage HTML :

• On met du HTML dans le foreach :

@foreach($datas as $data) <h4>

Nom : {{$data->name}} -- Done : {{$data->done}}

</h4>

@endforeach

• // {{ }} on met du php dans le html : c'est <?php echo ?>

• On peut remplacer le {{ }} par du php

@foreach($datas as $data) <h4>

Nom : <?php echo $data->name ?> -- Done : <?php echo $data->done ?>

</h4>

@endforeach

Ajout d’un filtre : done=0

• A ce stade :

 Route::ressources('todos', 'TodoController')

 App\Http\Controllers\TodoController.index()

=>ressources\views\todos\index.blade.php

• L’objectif est de récupérer un tableau de datas avec le filtre : done=0

• Ca se passe dans le TodoController

 Il faut faire un équivalent de « where done=0 » sur le all()

 Laravel utilise une methode : reject(), qu'on chaine au all()

• On passe une fonction anonyme en paramètre du reject() qui définit le filtre.

 C'est le même principe qu'un map et filter JavaScript.

$datas = Todo::all()->reject(function($todo){

return $todo->done == 0 })

 A noter qu'on pourrait faire toutes sortes de calcul et de test.

(40)

Laravel – P3 - page 40/68

Affichage avec Layout et Bootstrap

Situation

• On sait parcourir les données de la BD

• On sait y mettre des données

• On a créé un design plus abouti

• Notre vue hérite du layout

 http://127.0.0.1:8000/todos

On va mettre ça dans des composants bootstrap

• On utilise les composants « alert » et « badge » de bootstrap :

@foreach($datas as $data)

<div class="alert alert-primary" role="alert">

<strong>

{{ $data->name }}

@if($data->done )

<span class="badge badge-success">

done </span>

@endif </strong>

</div>

@endforeach

 C’est déjà un résultat présentable. En quelques lignes de code ! Version sans blade avec seulement du PHP :

<?php foreach($datas as $data) { ?>

<div class="alert alert-primary" role="alert">

<strong>

<?php echo $data->name ?>

<?php if ($data->done ) { ?>

<span class="badge badge-success">

done </span>

<?php } ?>

</strong>

</div>

<?php } ?>

(41)

Laravel – P3 - page 41/68 Installation et utilisation d’un plugin bootstrap

• On installe le dernier plugin bootstrap. Il faudra peut-être redémarrer VS Code pour qu’il fonctionne.

• On veut un composant alerte :

 Dans le fichier de code : on tape alerte :

• On choisit default. On obtient :

<div class="alert alert-primary" role="alert">

<strong>primary</strong>

</div>

• On veut un composant badge :

 Dans le fichier de code : on supprime le primary du <strong> et on tape badge :

• On choisit default puis success. On obtient :

<div class="alert alert-primary" role="alert">

<strong>

<span class="badge badge-success"></span>

</strong>

</div>

• Ensuite on complète avec ce qu’on veut afficher.

on affiche toutes les todos : les terminés ont le bouton, les autres rien

Exemples de tuto bootstrap :

• Sur les composant alert : https://www.pierre-giraud.com/bootstrap-apprendre-cours/alerte- modal-toast/

• Sur les composant badge : https://www.pierre-giraud.com/bootstrap-apprendre-cours/badge- jumbotron/

(42)

Laravel – P3 - page 42/68 Bootstrap ou HTML 5 ?

On peut aussi se passer de Bootstrap et coder uniquement en HTML 5 en gérant son CSS soit même.

• Version bootstrap

@foreach($datas as $data)

<div class="alert alert-primary" role="alert">

<strong>

{{ $data->name }}

@if($data->done )

<span class="badge badge-success">

done </span>

@endif </strong>

</div>

@endforeach

• Version HTML 5

 On a mis le style directement dans le code pour l’exemple. Il faudrait en réalité le mettre dans un fichier CSS.

 En partant de rien, c’est quand même plus pratique avec du bootstrap !

<style>

.uneTodo {

display: flex ;

background-color : aqua ; margin:10px;

}

.uneTodo .todoDone {

background-color : green ; }

</style>@foreach($datas as $data) <div class="uneTodo">

<p>{{ $data->name }}</p>

<p @if($data->done )class="todoDone" @endif>

done

</p>

</div>

@endforeach

(43)

Laravel – P3 - page 43/68

Amélioration de la présentation : système de pagination v11

Problèmatique de la pagination

• Actuellement, on a toutes les todos : ce n’est pas agréable visuellement et ça peut ralentir le système puisqu’il faut charger toutes les données.

• On va donc afficher les données « page à page », c’est-à-dire par parquet (de 10, 15, au choix).

• En PHP, gérer la pagination est une tâche assez lourde, mais aussi répétitive.

• Laravel va nous fournir des outils pour gérer ça de façon très simple.

Technique de pagination

Mise à jour du contrôleur de ressources

• Actuellement : all() dans le contrôleur de ressources.

• On remplace par paginate(10) et on a 10 résultats par page.

$datas=Todo::paginate(10);

 Ca marche !

 Mais on n’a pas la barre de pagination.

• https://laravel.com/docs/8.x/pagination

Mise à jour de la vue

• Pour afficher la barre de pagination, on modifie le template : views/todos/index.php

• On ajoute, juste après le @endforeach : {{ $datas->links()}}

 De là, on accède aux pages : on voit l'url.

 http://127.0.0.1:8001/todos?page=2

• https://laravel.com/docs/8.x/pagination#displaying-pagination-results

Bootstrap

• On a un problème si on utilise Bootstrap :

 https://laravel.com/docs/8.x/pagination#using-bootstrap

• Il faut mettre à jour le fichier App\Providers\AppServiceProvider : use Illuminate\Pagination\Paginator;

public function boot() {

Paginator::useBootstrap();

}

(44)

Laravel – P3 - page 44/68

5 –Boutons de gestion des todos v12-13

Menu principal : gestions des todos

Objectif

• Une barre à 3 boutons : ajouter, toutes, terminées.

Principes de résolution

• On gère les Todos :

• Vues :

 Mettre à jour le template views/todos/index.php

 Il faut écrire du HTML (Bootstrap)

 Les vues appellent des routes dans les <a> et les <form>

• Routes :

 Créer les routes todos/create, todos/undone, todos/done,

 Les routes appellent des fonctions de contrôleur

• Créer des contrôleurs :

• On va faire bouton par bouton.

Eléments techniques

• Bootstrap

• Blade : @if, @foreach

• SQL Laravel : https://laravel.com/docs/8.x/queries

(45)

Laravel – P3 - page 45/68

Menu principal : ajouter une todo

Vue : views/todos/index.php

• On se place avant le foreach et on met nos boutons en bootstrap

• On peut y mettre un <h1>coucou</h1> pour vérifier.

• On peut écrire un code minimaliste :

<div><a href={{ route('todos.create') }}>Ajouter</a></div>

 Le lien fonctionne et amène sur une page vide.

Route : route('todos.create')

• Affichage des routes existantes : php artisan route:list

 On a une route todos/create

 Name : todos.create

 Action : App\Http\Controllers\TodoController@create

• La fonction route('nom.de.route')

 Elle retourne l’URL correspondant au nom de la route

 https://laravel.com/docs/8.x/routing#generating-urls-to-named-routes

 Ici : le href renvoie sur la route nommée « todos.create »

 Action d’une route

 La route appelle un contrôleur.

 Ici : App\Http\Controllers\TodoController@create.

 C’est la méthode « create » de la classe App\Http\Controllers\TodoController.

 Cette méthode existe par défaut dans un controller créé avec php artisan make:controller

 Elle ne fait rien. On la créera plus tard.

(46)

Laravel – P3 - page 46/68

Menu principal : todos ouvertes (undone) et todos terminées (done)

Vue : views/todos/index.php

• On ajoute deux balises a pour les deux autres boutons :

<div>

<a href={{ route('todos.create') }}>Ajouter</a>

<a href={{ route('todos.done) }}>Ouvertes</a>

<a href={{ route('todos.undone) }}>Terminées</a>

</div>

 Les liens ne fonctionnent pas : les routes n’existent pas.

Route : création des routes ('todos.done') et ('todos.undone')

• Dans le fichier des routes : routes/web.php

• Avant la route ressource finale :

 2 routes get 'todos/done' et 'todos/undone'

 On reprend la syntaxe qu’on trouve dans le fichier : Route::get('/todos/undone',

[App\Http\Controllers\TodoController::class, 'undone']

)->name('todos.undone');

Route::get('/todos/done',

[App\Http\Controllers\TodoController::class, 'done']

)->name('todos.done');

 Les liens fonctionnent mais les contrôleurs n’existent pas.

Contrôleurs : on crée des contrôleurs vides

• On va ajouter les méthodes done() et undone() dans le TodoController

• On prendre exemple sur l'index qui affichait tout avec : $datas=Todo::paginate(10);

• Le paginate fait un all() : c’est du SQL

• Laravel permet d’encapsuler le SQL :

 https://laravel.com/docs/8.x/queries

• Ici, on va faire un where : where done=1 ou where done=0 public function done()

{

$datas = Todo::where('done', 1)->paginate(10);

return view('todos.index', compact('datas')) ; }

 Idem avec undone.

 Ca marche !

Références

Documents relatifs

La création d’un nouveau fichier se fait dans le répertoire courant. Suppression d’un fichier

La création d’un nouveau fichier se fait dans le répertoire courant.. Suppression d’un fichier

Écrire une fonction PHP prenant en argument un tableau associatif $assoc, et produisant (avec echo) un tableau HTML à deux colonnes, la première colonne contenant les clés du

Ajouter au formulaire un champ de soumission de chier, et adapter le code du script pour acher, pour les paramètres chiers, le nom du chier soumis par le client dans la

• Pour mettre à jour la BD et créer les tables correspondant à notre installation Laravel, il faut commencer par mettre à jour le fichier App/Providers/AppServicesProvider.php :..

• A noter qu’un utilisateur pourra toujours affecter sa todo à un autre, même s’il n’est pas créateur de la todo (d’où la distinction entre l’utilisateur créateur

Cela a vous a peut être parut un peu lourd, mais si vous n'avez fait que survolez cette partie, vous verrez que vous y reviendrais car c'est vraiment des bases très importants à

Pour cela, il existe la directive safe_mode à activer dans le php.ini. Elle permet entre autres de.. pourra accéder à un fichier que si le propriétaire du fichier est le même que