Guide de Cours Et TPs - M205 - Laravel - Fev 2024
Guide de Cours Et TPs - M205 - Laravel - Fev 2024
Guide de Cours Et TPs - M205 - Laravel - Fev 2024
L’essentiel de Laravel
1 / 105
Très bon cours :
https://apcpedagogie.com/cours-et-tutoriels/les_cours/cours-de-programmation/laravel/
Laravel?
I. Installation des outils pour Laravel
1. Installation de Composer
Pour installer Composer, il suffit de télécharger un installeur :
https://getcomposer.org/download/
Vérifiez lors de l'installation que le chemin par défaut vers PHP est bien
C:\PHP\php.exe, car Composer est un fichier PHP et a besoin d’être exécuté.
2. Vérifications
Pour vérifier que tout fonctionne, exécuter composer sur la ligne de commande
comme suit :
2 / 105
2. Créer notre premier projet laravel (tp1_laravel) – Méthode 1 :
Taper la commande :
Ici nous avons demandé à composer de créer une installation Laravel dans le dossier
«tp2_laravel». Cette commande installera automatiquement la dernière version stable de
Laravel.
Finalement :
3 / 105
III. Architecture d’un projet Laravel
4 / 105
2) Pour afficher un écran d'aide, faites précéder le nom de la commande de
help :
artisan route:list
ensuite :
5 / 105
VI. Application MVC avec Laravel :
Les Modèles (Models)
Ce que nous appelons un Modèle est en réalité un fichier PHP qui ne
fait que gérer les échanges avec la base de données. Lorsque nous
avons besoin de lire ou écrire dans la base de données, nous faisons
appel au Modèle.
Le modèle est la couche représentant les données. On l’appellera
parfois logique métier.
Le modèle consiste en une série de classes. Si les données sont tirées
de la BD, chacune des classes représentera une table.
Parmi les fonctionnalités codées dans le modèle, on retrouve les
relations entre les tables, les accesseurs et modificateurs, les champs
calculés, etc.
6 / 105
La vue pourra faire appel à des ressources externes, comme des
feuilles de style, des fichiers JavaScript, des images, etc.
Sous Laravel, le moteur d’affichage s’appelle Blade.
Exemples
Dans une architecture MVC, nous allons pointer vers des dossiers virtuels
appelés routes
http://monsite.fr/user/inscription
http://monsite.fr/user/login
http://monsite.fr/blog/article
…
VII. Application
Pour comprendre comment Laravel intègre la logique MVC, créons un
exemple de projet Laravel qui affiche la liste des apprenants d’une école de
formation.
Pour créer un nouveau projet, exécutez la commande ci-dessous dans votre
terminal :
7 / 105
laravel new gestionApprenant
8 / 105
Laravel fournit un système de routes simple. Déclarer une route permet
de lier une URI (identifiant de ressource uniforme, autrement dit la
partie de l’adresse qui suit le nom de domaine) à un code à exécuter.
Toutes les routes Laravel sont définies dans le fichier situé sous
/routes/web.php , qui est automatiquement chargé par le framework
2. Présentation
Lorsque Laravel est installé et configuré, vous aurez tous les fichiers
dont vous avez besoin dans votre dossier pour commencer un
projet Laravel.
Lorsqu’on affiche une page Web Laravel dans le navigateur, l’URL ne
se terminera pas par le nom d’un fichier (.html ou .php). Plutôt, il
s’agira d’une suite de mots ressemblant à des dossiers et sous-
dossiers, comme par exemple http://127.0.0.1:8000/inscription.
Toutes les routes d’application sont enregistrées dans le
fichier web.php .
Fichier routes/web.php :
Route::get('accueil', function () {
return "Bienvenue sur le site !";
});
9 / 105
Dans ce cours, nous nous concentrerons principalement sur
le web.php, car c’est là que tous nos itinéraires vont vivre.
Routage de base
Routes nommés
Paramètres de Route
3. Routage de base
Route basique
Une route Laravel très basique est simplement exprimée comme
suit :
Route::get('/', function () {
return "Welcome to Laravel Site.";
});
Ici, « Route » est une classe qui a une méthode statique « get »
qui renvoie une méthode « view » qui présente une page Web.
10 / 105
À l’installation Laravel a une seule route qui correspond à l’URL
de base composée uniquement du nom de domaine. Voyons
maintenant comment créer d’autres routes.
Imaginons que nous ayons trois pages qui doivent être affichées
avec ces URL :
http://monsite.fr/1
http://monsite.fr/2
http://monsite.fr/3
api.php,
channels.php,
console.php
web.php
Comme Laravel est explicite vous pouvez déjà deviner à quoi sert ce code :
Route::get('/', function () {
return view('welcome');
});
Route::get('/inscription', function () {
return view('inscription');
});
12 / 105
Verbes de route
Vous avez peut-être remarqué que nous utilisons Route :: get dans
nos définitions d’itinéraire.
Route::get('/', function () {
return 'Hello, World!';
});
13 / 105
Route::match(['get', 'post'], '/', function () {});
GET: Ceci est principalement utilisé pour récupérer les données du
serveur, sans modifier les données et les renvoyer à l’utilisateur.
POST: Cela nous permet de créer de nouvelles ressources ou données
sur le serveur, bien que cela puisse être utilisé uniquement pour envoyer
des données, pour un traitement ultérieur (cela pourrait être la validation
des données, comme dans le processus de connexion). Il est considéré
comme plus sûr que GET pour l’envoi de données sensibles.
PUT: Put fonctionne comme le POST dans le sens où il vous permet
d’envoyer des données au serveur, généralement pour mettre à jour une
ressource existante au lieu de la créer. Vous le mettez essentiellement.
4. Routes nommées
Il est parfois utile de nommer une route, par exemple pour générer
une URL ou pour effectuer une redirection.
L’avantage d’utiliser une route nommée est que si nous changeons
l’URL d’une route à l’avenir, nous n’aurons pas besoin de changer l’URL ou
les redirections pointant vers cette route si nous utilisons une route nommée.
Les routes nommées sont créées en utilisant as clé de tableau ou en utilisant la
méthode name
Route::get('uri', [
'as' => 'nomRoute',
'uses' => 'NomControleur@methode'
]);
Exemple:
Route::get('login', ['as' => 'home', 'uses'
=> 'HomeController@index']);
Route::get('/home', 'HomeController@index')->name('home');
14 / 105
Générer une URL à l’aide d’une route nommée
Pour générer une URL en utilisant le nom de la route :
$url = route('home');
$redirect = Redirect::route('home');
Route::get('{n}', function($n) {
return 'Je suis la page ' . $n . ' !';
});
15 / 105
Paramètres obligatoires
Par exemple, si vous souhaitez capturer l’ID utilisateur dans l’URL
lorsque vous souhaitez obtenir les détails de l’utilisateur, vous pouvez
vous référer aux pratiques suivantes :
Route::get('posts/{post}/comments/{comment}', function
($postId, $commentId) {
return 'Post : '.$postId.' - Comment : '.$commentId;
});
Paramètres facultatifs
Parfois, vous devez spécifier des paramètres de routage, mais les
paramètres ne sont pas obligatoires. Le caractère « ? » est marqué
après le nom du paramètre pour garantir que la valeur par défaut est
donnée à la variable correspondante de l’itinéraire.
16 / 105
6. Routage avec des méthodes de contrôleur
Vous pouvez créer une route avec une méthode de contrôleur d’appel, vous
pouvez donc simplement créer une méthode de contrôleur et appeler cette
méthode avec votre route comme ci-dessous :
Route::get('/home', 'HomeController@home');
7. Applications
Exercice 01
1- Créer la liste des routes pour répondre aux URL suivants :
http://localhost/laravel/public/
http://localhost/laravel/public/login
http://localhost/laravel/public/page/1
Route::get('/', function()
{
return 'accueil';
});
Route::get('login', function()
{
return 'login';
17 / 105
});
Route::get('page/1', function()
{
return 'page1';
});
Étapes de création
18 / 105
D’abord, créez un dossier nommé apprenants
sous ressources\views.
Dans ce dossier, créez le fichier index.blade.php et copiez-y le
code suivant : CRÉER UNE VUE SOUS LARAVEL
Ajoutez la ligne suivante dans le fichier routes/web.php pour définir
l’itinéraire pour la vue ci-dessus.
Route::get('/apprenants/index',function(){
return view('apprenants/index');
});
Voir le site
Menu
Exemple 1 :
Web.php
Route::get('/',function(){
return "<h1>Home Page</h1>";
});
Route::get('/about',function(){
return "<h1>About Page</h1>";
})->name('about');
Route::get('/contact',function(){
return "<h1>Contact Page</h1>";
});
19 / 105
Exemple 2 :
welcom.blade.php
<h1>Home Page</h1>
about.blade.php
<h1>About Page</h1>
contact.blade.php
<h1>Contact Page</h1>
Web.php
Route::get('/',function(){
return view('welcome');
});
Route::get('/about',function(){
return view('about');
})->name('about');
Route::get('/contact',function(){
return view('contact');
});
Exemple 3 :
welcom.blade.php
<html>
<head>
20 / 105
<title>Home</title>
<style>
nav a {
padding: 0.5rem;
}
</style>
</head>
<body>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>Home Page</h1>
</body>
</html>
about.blade.php
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>About Page</h1>
contact.blade.php
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>Contact Page</h1>
Web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MenuController;
Route::get('/',function(){
return view('welcome');
});
21 / 105
Route::get('/about',function(){
return view('about');
})->name('about');
Route::get('/contact',function(){
return view('welcome');
});
22 / 105
La tâche d’un contrôleur est de réceptionner une requête (qui a déjà été
sélectionnée par une route) et de définir la réponse appropriée, rien de
moins et rien de plus. Voici une illustration du processus :
C:\wamp64\www\TPs laravel\tp1_laravel>
23 / 105
a) Créer un simple contrôleur vierge
Taper la commande suivante :
php artisan make:controller ClientController
ClientController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
ClientController.php
<?php
namespace App\Http\Controllers;
24 / 105
use Illuminate\Http\Request;
Route::get('/clients/index',
'App\Http\Controllers\ClientController@clients');
Pour completer l’exemple, nous allons créer un dossier clients dans resources\views.
Ensuite créer la vue index.blade.php dans le dossier clients :
index.blade.php
Liste des clients
ClientController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
26 / 105
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
27 / 105
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
Un contrôleur est une classe qui étend la classe de base Controller et dont
chaque méthode publique représente généralement une action qui
correspond à une route.
Fichier app/Http/Controllers/clients/ClientController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
28 / 105
public function show($id){
return view('clients.show', [
'client' => Product::find($id)
]);
}
}
Web.php
Route::get('/clients','ClientController@clients');
Route::get('/clients/{id}','ClientController@show');
29 / 105
b) Route nommée
De la même manière que nous pouvons nommer une route classique
on peut aussi donner un nom à une route qui pointe une méthode de
contrôleur :
Route::get('/', 'WelcomeController@index')->name('home');
Route::get('videos', 'VideoController@index');
Route::get('videos/creer', 'VideoController@create');
Route::post('videos/creer', 'VideoController@store');
Route::get('videos/{id}', 'VideoController@show');
MenuController.php
<?php
namespace App\Http\Controllers;
30 / 105
use Illuminate\Http\Request;
Web.php
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MenuController;
Route::get('/',[MenuController::class, 'index']);
Route::get('/about',[MenuController::class, 'about']);
Route::get('/contact',[MenuController::class, 'contact']);
MenuController.php
<?php
31 / 105
namespace App\Http\Controllers;
use Illuminate\Http\Request;
about.blade.php
<h1>About Page</h1>
contact.blade.php
<h1>Contact Page</h1>
Menu :
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MenuController;
Route::get('/',[MenuController::class,'index'])->name('home');
Route::get('/about',[MenuController::class,'about'])->name('about');
Route::get('/contact',[MenuController::class,'contact'])
->name('contact');
32 / 105
welcome.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale())
}}">
<head>
<meta charset="utf-8">
<title>Laravel</title>
<style>
nav a {
padding: 0.5rem;
}
</style>
</head>
<body>
<div>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>Home Page</h1>
</div>
</body>
</html>
about.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<title>About</title>
<style>
nav a {
padding: 0.5rem;
}
</style>
</head>
33 / 105
<body>
<div>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>About Page</h1>
</div>
</body>
</html>
contact.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact</title>
<style>
nav a {
padding: 0.5rem;
}
</style>
</head>
<body>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<h1>Contact Page</h1>
</body>
</html>
34 / 105
II. Blade Templates Layout
layout.blade.php
<!-- Stored in resources/views/layouts/layout.blade.php -->
<html>
<head>
<title>App Name - @yield('title')</title>
<style>
header {
width: 100%;
background-color: yellow;
text-align: center;
}
footer {
width: 100%;
background-color: lightblue;
text-align: center;
}
nav a {
padding: 0.5rem;
}
</style>
<link rel="stylesheet" href="{{ asset('css/style.css') }}">
</head>
<body>
<header>
<div>
<h1>Header</h1>
</div>
</header>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
</nav>
<div class="container">
@yield('content')
35 / 105
</div>
<footer>
<h4>Footer</h4>
</footer>
</body>
</html>
style.css
<!-- Stored in public\css\style.css -->
header {
width: 100%;
background-color: yellow;
text-align: center;
}
footer {
width: 100%;
background-color: lightblue;
text-align: center;
}
nav a {
padding: 0.5rem;
}
table {
text-align: center;
border-collapse: collapse;
}
td, th {
border : 2px solid green;
width: 80px;
}
.th {
background-color: lightblue;
font-weight: bold;
}
.tr {
36 / 105
background-color: yellow;
}
.action {
width: 150px;
}
home.blade.php
<!-- Stored in resources/views/home.blade.php -->
@extends('layout')
@section('title', 'Home')
@section('content')
<h1>Home Page</h1>
@endsection
about.blade.php
!-- Stored in resources/views/home.about.php -->
@section('title', 'About')
@section('content')
<h1>About Page</h1>
@endsection
contact.blade.php
<!-- Stored in resources/views/contact.blade.php -->
@extends('layout')
@section('title', 'Contact')
@section('content')
<h1>Contact Page</h1>
@endsection
37 / 105
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MenuController;
Route::resource('clients',
App\Http\Controllers\ClientController::class);
Route::get('/',function(){
return view('welcome');
});
Route::get('/about',function(){
return view('about');
})->name('about');
Route::get('/contact',function(){
return view('contact');
});
38 / 105
web.php (with controller MenuController)
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\MenuController;
Route::get('/',[MenuController::class, 'index']);
Route::get('/about',[MenuController::class, 'about'])-
>name('about');
Route::get('/contact',[MenuController::class, 'contact']);
Ou bien :
web.php
Route::get('/','App\Http\Controllers\MenuController@index');
Route::get('/about','App\Http\Controllers\MenuController@about')
->name('about');
Route::get('/contact','App\Http\Controllers\MenuController@contact');
MenuController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
39 / 105
}
Texte brut
Json Array
Vue HTML ou blade
XML
Téléchargement de fichier
Sortie PDF ou image sur navigateur directement etc …
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
40 / 105
b) Rendre un fichier de vue blade situé dans le dossier resources/views
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
<?php
41 / 105
namespace App\Http\Controllers;
use Illuminate\Http\Request;
return response($content)
->header('Content-Type', $type)
->header('X-Header-One', 'Header Value1')
->header('X-Header-Two', 'Header Value2');
}
}
<? php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
42 / 105
class UserController extends Controller
{
function example()
{
// download a file with given path
return response()->download($pathToFile);
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
43 / 105
// redirect with named route by passing variables
return redirect()->route('profile', ['id' => 1]);
Route::get('/', function () {
return response()->json([
'message' => 'Hello, World!'
]);
});
1. Response types :
a) Basic response
Route::get('/',function(){
return response('Hello World', 200);
});
44 / 105
Route::get('/',function(){
return response()->view('welcome');
});
a) HTML response
Route::get('/',function(){
return response()->view('welcome',['name'=> 'Ali',]);
});
Welcome.blade.php
<h1>Home Page</h1>
<h2>Name : {{$name}}</h2>
b) JSON response
Route::get('/users', function () {
$users = [
['userid' => 1, 'name' => 'Alex'],
['userid' => 2, 'name' => 'Jane'],
];
return response()->json($users);
});
45 / 105
c) redirect response
Route /signin
Route::get('/signin', function () {
// Action: user authenticated
// or
Route /dashboard
Route::get('/dashboard', function () {
return view('dashboard');
});
// or
46 / 105
return response()->redirect(route('dashboard'));
});
Route::get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
d) download response
Route::get('/download', function () {
// return download('F:\premiers-pas-avec-les-
winforms.pdf');
// or
return response()->download('F:\premiers-pas-avec-
les-winforms.pdf');
});
a) File response
Route::get('/download', function () {
return response()->download('F:\premiers-pas-avec-
les-winforms.pdf');
// or
return response()->file('F:\premiers-pas-avec-les-
winforms.pdf');
// or
return response()->stream('F:\premiers-pas-avec-les-
winforms.pdf');
});
47 / 105
1. Connexion à une base de données MySQL avec Laravel
Le Framework Laravel permet une interaction très facile avec les BD à
travers l’ORM Eloquent.
Laravel supporte initialement quatre SGBD :
• MySQL
• PostgreSQL
• SQLite
• SQL Server
Dans ce cours, nous utiliserons MySQL, qui est l’une des plateformes les
plus populaires et gratuites pour
développement.
Laravel utilise The PHP Data Objects (PDO), qui est une interface
légère et cohérente pour accéder bases de données en PHP.
a) Créer une base de données MySQL
Nous devons d’abord créer une base de données (Vente). Nous pouvons
utiliser soit phpMyAdmin de WampServer ou l’interface Workbench.
Création de la BD Vente
Create database Vente;
Use Vente;
48 / 105
Toutes les configurations de la base de données prise en charge sont
stockées dans config/database.php. Ce fichier contient des détails
spécifiques à la connexion à une base de données.
Ce fichier spécifie également la connexion par défaut pour une base de
données qui est MySQL.
Mais c’est dans le fichier .env du répertoire racine de l’application que
nous allons utiliser pour configurer l’accès à la base de données.
page1.blade.php.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Laravel</title>
</head>
<body>
<h1>Page1</h1>
<?php
if (DB::connection()->getPdo()) {
echo "Connexion réussie à la BD => "
.DB::connection()->getDatabaseName();
}
$clients = DB::table('client')->get();
echo "<br>";
49 / 105
echo "Nombre de clients : ".count($clients);
echo "<br>";
echo "Nom : ".$clients[0]->Nom;
?>
</body>
</html>
Et une route :
Route :: get ('/page1', function () {
return view('page1');
});
50 / 105
L’ORM fonctionne avec des objets de base de données et est utilisé pour
établir des relations avec des tables de base de données. Chaque table
de la base de données est mappée avec un modèle éloquent particulier.
L’objet modèle contient diverses méthodes pour récupérer et mettre à
jour les données de la table de base de données.
Eloquent ORM peut être utilisé avec plusieurs bases de données en
implémentant ActiveMethod.
Eloquent ORM rend facile l’exécution des opérations CRUD (Créer, Lire,
Mettre à jour, Supprimer) sur le modèle Laravel.
3. Comment fonctionne Eloquent?
Il s’agit d’un modèle architectural où le modèle créé dans la
structure Model-View-Controller (MVC) correspond à une table dans la
base de données.
L’avantage est que les modèles effectuent des opérations de base de
données courantes sans coder de longues requêtes SQL.
Tout ce que vous avez à faire est de définir les tables de la base de
données et les relations entre elles, et Eloquent fera le reste du travail.
4. Configuration de Laravel
Voici les étapes pour commencer:
Migration
a) Présentation
La migration est un processus de gestion de votre base de
données en écrivant PHP plutôt que SQL.
La migration est un type de contrôle de version pour votre base
de données. Il permet à une équipe de modifier le schéma de la
base de données et de rester à jour sur l’état actuel du schéma.
51 / 105
Les Migrations sont une sorte de contrôleur de version pour la
BD, permettant, à une équipe, de modifier et partager le schéma
d’une BD facilement.
5. Exemple pratique :
a) Création de la migration de création de la table clients :
52 / 105
public function up(): void
{
Schema::create('clients', function (Blueprint $table)
{
$table->integer('CodeCl');
$table->string('Nom', 40);
$table->string('Ville', 40);
$table->primary('CodeCl');
});
}
Dans ce cas les méthodes down des migrations sont exécutées et les
tables sont supprimées.
54 / 105
Exécuter le Seeder
Exécuter le Seeder puis vérifier la table dans l’interface Workbench (ou
PhpMyAdmin) :
Workbench :
Use Vente;
Select * From clients;
Web.php
Route::resource('clients', App\Http\Controllers\ClientController::class);
ClientController.php (Vide)
<?php
namespace App\Http\Controllers;
use App\Models\Client;
use Illuminate\Http\Request;
Client.php (Vide)
55 / 105
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
namespace App\Http\Controllers;
use App\Models\Client;
use Illuminate\Http\Request;
Client.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
56 / 105
use Illuminate\Database\Eloquent\Model;
Index.blade.php
<!-- Stored in resources/views/client/index.blade.php -->
@extends('layout')
@section('content')
<h1>Client Home Page</h1>
<table>
<tr class="th">
<th>Code</th>
<th>Nom</th>
<th>Ville</th>
<th class="action">Action</th>
</tr>
@foreach ($clients as $client)
<tr class="tr">
<td>{{ $client->CodeCl }}</td>
<td>{{ $client->Nom }}</td>
<td>{{ $client->Ville }}</td>
<td class="action">
<form action="{{ route('clients.destroy',
57 / 105
$client->CodeCl) }}" method="POST">
@csrf
@method('DELETE')
<button type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</table>
@endsection
@section('content')
<h1>Create Client</h1>
<form method="POST" action="{{
action('App\Http\Controllers\ClientController@store') }}">
@csrf
<div>
<label>Code</label>
<input type="text" name="code" id="code">
</div>
58 / 105
<div>
<label>Nom</label>
<input type="text" name="nom" id="nom">
</div>
<div>
<label>Ville</label>
<input type="text" name="ville" id="ville">
</div>
<button type="submit">Submit</button>
</form>
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@endsection
Web.php
Route::resource('clients', App\Http\Controllers\ClientController::class);
https://laravel.com/docs/10.x/eloquent#inserts
ClientController.php
59 / 105
<?php
namespace App\Http\Controllers;
use App\Models\Client;
use Illuminate\Http\Request;
// Validation formulaire
$validated = $request->validate([
'code' => 'required',
'nom' => 'required',
'ville' => 'required',
]);
// Client::create($request->all());
$client->save();
edit.blade.php
@extends('layouts/layout')
@section('content')
<h1>Edit Client</h1>
<form method="POST" action="{{
route('client.update',$client) }}">
@csrf
@method('PUT')
<div>
<label>Code</label>
<input type="text" name="code" id="code"
value="{{$client->CodeCl}}">
</div>
<div>
<label>Nom</label>
<input type="text" name="nom" id="nom"
value="{{$client->Nom}}">
</div>
<div>
<label>Ville</label>
<input type="text" name="ville" id="ville"
value="{{$client->Ville}}">
62 / 105
</div>
<button type="submit">Update</button>
</form>
@endsection
@section('content')
<h1>Client Home Page</h1>
<a href="{{ route('client.create') }}" style="margin-left:
350px;">Add</a>
<table>
<tr class="th">
<th>Code</th>
<th>Nom</th>
<th>Ville</th>
<th class="action">Action</th>
</tr>
@csrf
@method('DELETE')
63 / 105
<button type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</table>
@endsection
style.css
header {
width: 100%;
background-color: yellow;
text-align: center;
64 / 105
}
footer {
width: 100%;
background-color: lightblue;
text-align: center;
}
nav a {
padding: 0.5rem;
}
table {
text-align: center;
border-collapse: collapse;
}
td, th {
border : 2px solid green;
width: 80px;
padding: 0%;
}
.th {
background-color: lightblue;
font-weight: bold;
}
.tr {
background-color: yellow;
}
.action {
width: 150px;
}
layout.blade.php (Vide)
<!-- Stored in resources/views/layouts/app.blade.php -->
<html>
65 / 105
<head>
<title>App Name - @yield('title')</title>
<style>
</style>
<link rel="stylesheet" href="{{ asset('css/style.css') }}">
</head>
<body>
<header>
<div>
<h1>Header</h1>
</div>
</header>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
<a href="/page1">Page1</a>
</nav>
<div class="container">
@yield('content')
</div>
<footer>
<h4>Footer</h4>
</footer>
</body>
</html>
66 / 105
<title>@yield('title')</title>
<link rel="stylesheet" href="{{ asset('css/style.css') }}">
</head>
<body>
<header>
<h1>Header</h1>
</header>
<nav>
<a href="/">Home</a>
<a href="{{route('about')}}">About</a>
<a href="/contact">Contact</a>
<a href="/client">Clients</a>
</nav>
<div class="container">
@yield('content')
</div>
<footer>
<h4>Footer</h4>
</footer>
</body>
</html>
Validation :
create.blade.php
@extends('layouts/layout')
67 / 105
@section('title', 'Create Form')
@section('content')
<h1>Create Client</h1>
<form method="POST" action="{{
action('App\Http\Controllers\ClientController@store') }}">
@csrf
<div>
<label>Code</label>
<input type="text" name="code" id="code">
</div>
<div>
<label>Nom</label>
<input type="text" name="nom" id="nom">
</div>
<div>
<label>Ville</label>
<input type="text" name="ville" id="ville">
</div>
<button type="submit">Submit</button>
</form>
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
@endsection
edit.blade.php
@extends('layouts/layout')
68 / 105
@section('title', 'Edit Page')
@section('content')
<h1>Edit Client</h1>
<form method="POST" action="{{
route('client.update',$client) }}">
@csrf
@method('PUT')
<div>
<label>Code</label>
<input type="text" name="code" id="code"
value="{{$client->CodeCl}}">
</div>
<div>
<label>Nom</label>
<input type="text" name="nom" id="nom"
value="{{$client->Nom}}">
</div>
<div>
<label>Ville</label>
<input type="text" name="ville" id="ville"
value="{{$client->Ville}}">
</div>
@if ($errors->any())
<div>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<button type="submit">Update</button>
</form>
@endsection
69 / 105
ClientController
<?php
namespace App\Http\Controllers;
use App\Models\Client;
use Illuminate\Http\Request;
// Client::create($request->all());
return redirect('/client');
}
// Update data
$client->CodeCl = $request->input('code');
$client->Nom = $request->input('nom');
$client->Ville = $request->input('ville');
$client->save();
return redirect('/client');
}
}
Exemples :
request()->validate([
'email' => ['required', 'email'],
'password' => ['required', 'confirmed', 'min:8'],
'password_confirmation' => ['required'],
]);
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
bail : stop running validation rules for the field after the first validation failure.
$request->validate([
72 / 105
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
before:date
before_or_equal:date
between:min,max
boolean
date
image
date_equals:date
decimal:min,max
different:field
distinct
'foo.*.id' => 'distinct:ignore_case'
doesnt_start_with:foo,bar,...
doesnt_end_with:foo,bar,...
ends_with:foo,bar,...
exclude
exclude_if:anotherfield,value
exists:table,column
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
Validator::make($input, [
'airports' => [
73 / 105
'required',
'array',
],
'airports.*' => Rule::in(['NYC', 'LIT']),
]);
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
nullable|numeric|required|required_if:anotherfield,value,...
// image
'avatar' => 'dimensions:min_width=100,min_height=200'
'avatar' => 'dimensions:ratio=3/2'
2024_04_22_011421_create_clients_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('clients');
}
}
2024_05_07_001637_create_commandes_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
76 / 105
$table->timestamps();
$table->primary('NumCom');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('commandes');
}
}
ClientsTableSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
77 / 105
'CodeCl' => 2,
'Nom' => 'Naji',
'Ville' => 'Casa'
],
[
'CodeCl' => 3,
'Nom' => 'Sqalli',
'Ville' => 'Fes'
]
]);
}
}
CommandesTableSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
Client.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
}
79 / 105
Commande.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
$commandes = Client::find(1)->commandes;
$commande = Commande::find(100);
$Nom = $commande->client->Nom;
80 / 105
Ou bien si on veut créer les modèles et les migrations en même temps :
@section('content')
<h1>Edit Client</h1>
<form method="POST" action="{{ route('client.index') }}">
@csrf
@method('GET')
<div>
<label>Code</label>
<input type="text" name="code" id="code"
value="{{$client->CodeCl}}" disabled>
</div>
<div>
<label>Nom</label>
<input type="text" name="nom" id="nom"
value="{{$client->Nom}}" disabled>
</div>
<div>
<label>Ville</label>
81 / 105
<input type="text" name="ville" id="ville"
value="{{$client->Ville}}" disabled>
</div>
@if (sizeof($client->commandes) > 0)
<table>
<tr class="th">
<th>NumCom</th>
<th>Date</th>
<th class="action">Action</th>
</tr>
<button type="submit">Retour</button>
</form>
@endsection
82 / 105
ClientController
<?php
namespace App\Http\Controllers;
use App\Models\Client;
use Illuminate\Http\Request;
$clients = Client::all();
$clients = $clients->diff(Client::whereIn('CodeCl', [1, 2])->get());
$clients = $clients->diff(Client::whereNotIn('CodeCl', [1, 2])-
>get());
$clients = $clients->except([1, 2]);
83 / 105
}
return redirect('/client');
}
}
84 / 105
Accéder aux données
// Tout obtenir
$todos = LeNomDeVotreTableEnBase::all();
// Ou avec un where
$users = User::where('votes', '>', 100)->get();
https://cours.brosseau.ovh/cheatsheets/laravel/
85 / 105
>orderBy('created_at', 'desc')->get();
Les Middlewares :
Un middleware permet d’intercepter une requête de l'utilisateur.
Nous pouvons, avant l'exécution de contrôleur (l'affichage d’une vue, la
création d'un nouveau message, la modification du mot de passe…),
effectuer des tests et rediriger si nécessaire l’utilisateur.
86 / 105
Exemple :
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
// dd('Bonjour');
// return redirect('/');
if (auth()->guest()) {
// flash("Vous devez être connecté pour voir
cette page.")->error();
return redirect('/login');
}
return $next($request);
}
}
87 / 105
Nous voulons pouvoir utiliser notre middleware sur plusieurs
routes/contrôleurs différents, nous ne devons donc pas savoir ce qu'il y a
après.
La variable $next peut donc contenir soit la modification du mot de passe,
soit l'affichage d'une vue mon-compte ou encore l'ajout d'un nouveau
message.
Pour le moment notre middleware return $next($request); cela signifie à
Laravel : « Exécute le reste de l'application et ne fait rien. ».
Activation du middleware
Route::resource('/client', App\Http\Controllers\ClientController::class)
->middleware('App\Http\Middleware\Auth');
Exemlpe 1 :
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
88 / 105
Exemlpe 2 : (redirection vers contact page)
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
89 / 105
Exemlpe 3 : (avec condition)
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
return $next($request);
}
}
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class Auth
{
90 / 105
if (auth()->guest()) {
return redirect('/login');
}
return $next($request);
}
}
91 / 105
Groupe de routes :
92 / 105
Groupes de routes (Partage de middleware st controller)
Les groupes de routes vous permettent de partager des attributs de route
comme les intergiciels sur un grand nombre de routes sans avoir à les
redéfinir sur chaque route.
Middleware
L’attribution d’un intergiciel à toutes les routes que nous avons nous permet
de les combiner dans un groupe, d’abord en utilisant la méthode group. Une
chose à considérer est que les intergiciels sont exécutés dans l’ordre dans
lequel ils sont appliqués au groupe :
Contrôleurs
93 / 105
Route::controller(UserController::class)->group(function () {
Route::get('/orders/{userId}', 'getOrders');
Route::post('/order/{id}', 'postOrder');
});
Database : Migrations
1. Tables
Creating Tables
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
if (Schema::hasTable('users')) {
// The "users" table exists...
}
if (Schema::hasColumn('users', 'email')) {
// The "users" table exists and has an "email" column...
}
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
94 / 105
Renaming / Dropping Tables
use Illuminate\Support\Facades\Schema;
Schema::rename($from, $to);
Schema::drop('users');
Schema::dropIfExists('users');
2. Columns
Creating Columns (add columns to the table)
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
$table->bigIncrements('id');
$table->bigInteger('votes');
$table->binary('photo');
$table->char('name', 100);
$table->date('created_at');
$table->double('amount', 8, 2);
95 / 105
$table->enum('difficulty', ['easy', 'hard']);
$table->float('amount', 8, 2);
$table->foreignId('user_id');
$table->foreignIdFor(User::class);
$table->id();
$table->id('num');
$table->integer('votes');
$table->json('options');
$table->longText('description');
$table->string('name', 100);
$table->text('description');
$table->year('birth_year');
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Modifier Description
->after('column') Place the column "after" another column (MySQL).
->autoIncrement() Set INTEGER columns as auto-incrementing (primary key).
->default($value) Specify a "default" value for the column.
->first() Place the column "first" in the table (MySQL).
96 / 105
->invisible() Make the column "invisible" to SELECT * queries (MySQL).
Column Order
The after method may be used to add columns after an existing column in the
schema:
Modifying Columns
The change method allows you to modify the type and attributes of existing
columns. For example, you may wish to increase the size of a string column.
Renaming Columns
Dropping Columns
3. Indexes
Creating Indexes
Renaming Indexes
Dropping Indexes
97 / 105
Foreign Key Constraints
Voir lien :
https://laravel.com/docs/10.x/migrations
Authentication (authentification)
@section('content')
<h1>Login Page</h1>
<form method="POST" action="{{route('tologin')}}">
@csrf
<div>
<label>Login :
</label>
<input type="text" name="login" id="login" >
@error('login')
<p>{{$message}}</p>
@enderror
</div>
<div>
<label>Password :</label>
<input type="text" name="password"
id="password">
@error('password')
<p>{{$message}}</p>
@enderror
</div>
Web.php
Route::resource('/client',
App\Http\Controllers\ClientController::class)-
>middleware('App\Http\Middleware\Auth');
Route::get('/login',
'App\Http\Controllers\AuthController@login')-
>name("login");
Route::post('/tologin',
'App\Http\Controllers\AuthController@tologin')-
>name("tologin");
AuthController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use app\Http\Requests\LoginRequest;
if(auth()->attempt($validated))
{
session()->regenerate();
return redirect()-
>intended(route('client.index'));
}
return to_route('client')->withErrors(
[
"login"=>'Login ou mot de passe invalide'
])
->withInput(['login','password']);
}
LoginRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
100 / 105
{
return true;
}
/**
* Get the validation rules that apply to the
request.
*
* @return array
*/
public function rules() : array
{
return [
"login"=>'required',
"password"=>'required|min:4'
];
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
101 / 105
public function up()
{
Schema::create('users', function (Blueprint
$table) {
$table->string('name');
$table->string('login')->unique();
$table->string('password');
});
}
https://laravel.com/docs/10.x/controllers
https://laravel-docs.readthedocs.io/en/latest/routing/
https://laravel.io/forum/form-action-does-not-go-to-the-right-controller
https://geekflare.com/fr/laravel-eloquent-model-relationship/
https://pusher.com/blog/laravel-mvc-use/
https://apcpedagogie.com/blade-templates/
https://pusher.com/blog/laravel-mvc-use/#controllers-creating-our-controller
https://www.w3schools.in/laravel/views
https://www.training-dev.fr/Cours/Laravel-8---Prendre-en-main-le-framework-avec-la-creation-d-un-blog/Front-le-panneau-d-
administration-partie-1
https://www.apprendre-laravel.fr/laraguide/2017-11-09-creer-un-formulaire
https://www.letecode.com/tutoriel-laravel-9-crud-pour-debutant-inserer-lire-modifier-et-supprimer
https://laravel.com/docs/10.x/blade
102 / 105
https://laravel.com/docs/10.x/eloquent-collections
https://morioh.com/a/34012c0b7093/creer-une-application-crud-de-base-avec-laravel-et-reactjs
https://code.tutsplus.com/fr/build-a-react-app-with-laravel-restful-backend-part-1-laravel-5-api--cms-
29442t
Q uelle est la différence entre URI et URL ? – L’URL signifier Uniform Resource Locator, qui est
utilisé pour identifier une ressource. Il s’agit d’un sous-ensemble d’URI. L’URI signifier Uniform
Resource Identifier offre un moyen plus simple et extensible d’identifier une ressource.
Un middleware est un logiciel qui fournit des services et fonctionnalités unifiés aux applications,
pour permettre aux équipes de développement et d'exploitation de créer et déployer des
applications plus efficacement. Un middleware joue le rôle de lien entre les applications, les
données et les utilisateurs.
Un middleware est un logiciel qui fournit des services et fonctionnalités unifiés aux applications,
pour permettre aux équipes de développement et d'exploitation de créer et déployer des
applications plus efficacement. Un middleware joue le rôle de lien entre les applications, les
données et les utilisateurs.
Maintenant je vais vous présenter les Middleware dans Laravel. Un Middleware est une mini-
application, une étape intermédiaire qui va envelopper les actions gérées par notre controller.
Elle est une sorte de sous-couche se plaçant entre la requête (request) et la réponse (response)
entre la vue et le controller.
103 / 105
https://laravel.com/docs/10.x/controllers#resource-controllers
Resource Controllers
If you think of each Eloquent model in your application as a "resource", it is typical to
perform the same sets of actions against each resource in your application. For
example, imagine your application contains a Photo model and a Movie model. It is likely
that users can create, read, update, or delete these resources.
Because of this common use case, Laravel resource routing assigns the typical create,
read, update, and delete ("CRUD") routes to a controller with a single line of code. To
get started, we can use the make:controller Artisan command's --resource option to
quickly create a controller to handle these actions:
use App\Http\Controllers\PhotoController;
Route::resource('photos', PhotoController::class);
This single route declaration creates multiple routes to handle a variety of actions on
the resource. The generated controller will already have methods stubbed for each of
these actions. Remember, you can always get a quick overview of your application's
routes by running the route:list Artisan command.
You may even register many resource controllers at once by passing an array to
the resources method:
Route::resources([
'photos' => PhotoController::class,
'posts' => PostController::class,
104 / 105
]);
105 / 105