( بِسْمِ اللَّـهِ الرَّحْمَـٰنِ الرَّحِيمِ )
Initialisation

Journée 013

Laravel

Framework PHP populaire pour le développement web

Tutoriel de départ

Étape 1 : Installer Laravel

Prérequis :

PHP : Version 8.1 ou supérieure.
Composer : Gestionnaire de dépendances PHP.
Serveur MySQL ou autre base de données.

Installation :

  1. Créer un nouveau projet Laravel :
    composer create-project laravel/laravel nom_du_projet
  2. Naviguer dans le dossier du projet :
    cd nom_du_projet
  3. Lancer le serveur de développement :
    php artisan serve
  4. Accédez à votre application dans un navigateur :
    http://127.0.0.1:8000

Étape 2 : Configurer le Projet

Configurer la base de données :

  1. Ouvrez le fichier .env à la racine du projet.
  2. Modifiez les paramètres de connexion :
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=nom_de_la_base
    DB_USERNAME=root
    DB_PASSWORD=
  3. Créez la base de données :
    Connectez-vous à MySQL et créez une base de données :
    CREATE DATABASE nom_de_la_base;
  4. Appliquer les migrations par défaut :
    php artisan migrate

 

Étape 3 : Structure de Laravel

Laravel suit le pattern MVC (Modèle-Vue-Contrôleur) :

Modèles : Interagissent avec la base de données (dans app/Models).
Vues : Gèrent l’affichage HTML (dans resources/views).
Contrôleurs : Gèrent la logique métier (dans app/Http/Controllers).

Étape 4 : Routes

Les routes définissent les URLs de votre application.

  • Emplacement :
    Les routes web sont définies dans routes/web.php.
  • Exemple :
    Ajoutez une route dans web.php :

use Illuminate\Support\Facades\Route;

Route::get(‘/’, function () {
return view(‘welcome’);
});

Route::get(‘/about’, function () {
return « À propos de Laravel »;
});

Résultats : – Accédez à http://127.0.0.1:8000/about pour voir le résultat.

Étape 5 : Créer une Vue

Les vues Laravel sont stockées dans resources/views.

  • Créez un fichier 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>À propos</title>
</head>
<body>
<h1>À propos de Laravel</h1>
<p>Ceci est une page simple.</p>
</body>
</html>

 

  • Modifiez la route pour utiliser cette vue :

Route::get(‘/about’, function () {
return view(‘about’);
});

Étape 6 : Créer un Modèle, une Migration et un Contrôleur

  • Créer un modèle avec une migration et un contrôleur :

php artisan make:model Book -mc

  • Modifier la migration :

La migration est dans : –  database/migrations/xxxx_xx_xx_create_books_table.php 

public function up()
{
Schema::create(‘books’, function (Blueprint $table) {
$table->id();
$table->string(‘title’);
$table->text(‘description’);
$table->timestamps();
});
}

  • Exécuter la migration :

php artisan migrate

  • Configurer le modèle :

Modifiez app/Models/Book.php :

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Book extends Model
{
use HasFactory;

protected $fillable = [‘title’, ‘description’];
}

  • Configurer le contrôleur :

Modifiez : – app/Http/Controllers/BookController.php

namespace App\Http\Controllers;

use App\Models\Book;
use Illuminate\Http\Request;

class BookController extends Controller
{
public function index()
{
$books = Book::all();
return view(‘books.index’, compact(‘books’));
}

public function create()
{
return view(‘books.create’);
}

public function store(Request $request)
{
$request->validate([
‘title’ => ‘required|string|max:255’,
‘description’ => ‘required|string’,
]);

Book::create($request->all());

return redirect()->route(‘books.index’);
}
}

  • Ajouter des routes :

Modifiez routes/web.php :

use App\Http\Controllers\BookController;

Route::resource(‘books’, BookController::class);

Étape 7 : Créer des Vues

Liste des livres (resources/views/books/index.blade.php)

@extends(‘layouts.app’) @section(‘content’) <h1>Liste des Livres</h1> <a href= »{{ route(‘books.create’) }} »>Ajouter un livre</a> <ul> @foreach ($books as $book) <li>{{ $book->title }}</li> @endforeach </ul> @endsection

Formulaire de création

(resources/views/books/create.blade.php) :

@extends(‘layouts.app’) @section(‘content’) <h1>Ajouter un Livre</h1> <form action= »{{ route(‘books.store’) }} » method= »POST »> @csrf <label for= »title »>Titre :</label> <input type= »text » name= »title » id= »title » required> <label for= »description »>Description :</label> <textarea name= »description » id= »description » required></textarea> <button type= »submit »>Ajouter</button> </form> @endsection

Étape 8 : Mettre en Place une Authentification

Installer Laravel Breeze pour une authentification rapide :

composer require laravel/breeze –dev
php artisan breeze:install
npm install && npm run dev
php artisan migrate

Lancer le serveur et accéder aux pages de connexion et d’inscription.

 

Ressources Documentation

https://laraveldaily.com/courses

Documentation

Apprendre

Communautés

Outils

  • Nova
    • Un tableau de bord d’administration élégant et puissant développé par Laravel.
    • Parfait pour gérer les applications Laravel de manière professionnelle.
  • Laravel Forge
    • Un outil pour déployer des applications Laravel sur des serveurs.
    • Idéal pour les développeurs qui souhaitent gérer facilement leurs infrastructures.
  • Envoyer
    • Service de déploiement sans temps d’arrêt pour Laravel et PHP.

Blogs et Articles

  • TutsMake
    • Contient des tutoriels bien expliqués, étape par étape.
    • Couvre divers sujets, de l’installation aux concepts avancés.
  • Pusher Blog – Laravel
    • Articles pratiques pour intégrer des fonctionnalités en temps réel comme les notifications et le chat.

Déploiement

Vidéos

 

Comment

Exemple : – Gestion de livres en bibliothèque
Tables à utiliser :

Users: name, email, password
Books: title, sumary, author_id
Authors: first_name, last_name, nationality

Etapes :

Création Dossier

Ouvrir le dossier avec vscode

Terminal : – composer create-project laravel/laravel .

Terminal : – php artisan -v  (Laravel Framework 11.34.2)

Terminal : – php artisan serve  ( Server running on [http://127.0.0.1:8000]

Créer une nouvelle base de données MySQL

Mettre à jour les informations de la base de données MySQL dans le fichier .env. ( ne doit surtout pas être partagé car  il contient des informations privées.)

Host localhost / 127.0.0.1
Port 8889
Username root
Password root
Socket /Applications/MAMP/tmp/mysql/mysql.sock
Test http://127.0.0.1:8000/ —> OK Page Laravel

Créer de modèle Laravel

Terminal : – php artisan make:model Books -m

INFO Model [app/Models/Books.php] created successfully.
INFO Migration [database/migrations/2024_12_05_102140_create_books_table.php] created successfully.

Note  : afin de corriger un bug récurent de Laravel ajoutez ce bout de code dans le script  ( app/providers/AppServiceProviders)  :

public function boot()
{
//Code à ajouter
Schema::defaultStringLength(191);
//Fin du code à ajouter
}

Note : pensez à ajouter le « use Illuminate\Support\Facades\Schema; » en haut du script.

 

( Migration ) –> Création de la table Books dans la base de données MySQL -bibliothèque –

Verifier dans le dossier —> database- migrations —> OK

public function up(): void
{
Schema::create(‘books’, function (Blueprint $table) {
$table->increments(‘id’); // ID
$table->string(‘nom’); // Titre du livre
$table->text(‘description’); // Description du livre
$table->decimal(‘prix’, 12, 2); // Prix du livre
$table->float(‘quantite’); // Quantité en stock

$table->string(‘authors’)->nullable(); // Auteur du livre
$table->string(‘category’)->nullable(); // Catégorie livre
$table->string(‘image’)->nullable(); // URL image
$table->string(‘links’)->nullable()->comment(‘Ou Acheter Ce Livre’); // Liens externe

$table->timestamps(); // created_at et updated_at
});
}

.

Action – >> Terminal : – php artisan migrate pour créer la table books dans la base de données

En Cas d’erreur SQLSTATE[HY000] [2002] Connection refused –>>> indique que Laravel ne parvient pas à se connecter à la base de données.

–>> Vérifier le fichier .env ( le DB_PORT=3306) notre port est 8889
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=bibliotheque
DB_USERNAME=root
DB_PASSWORD=root

..
Sur macOS avec Homebrew : Redémarrez le serveur MySQL —> Terminal : brew services restart mysql
Effacez le cache de configuration —> Terminal : php artisan config:clear —> Terminal : php artisan config:cache

Apparition de nouvelles tables dans PhpMyAdmin : bibliotheque
├── Nouvelle table
├── books
├── cache
├── cache_locks
├── failed_jobs
├── jobs
├── job_batches
├── migrations
├── password_reset_tokens
├── sessions
├── users

Notre modèle Books est utilisé pour interagir avec la table books de la base de données.
Nous allons ouvrir le fichier app/Models/Produit.php et le modifier :

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Books extends Model
{
use HasFactory;
protected $fillable = [‘nom’, ‘description’, ‘prix’, ‘quantite’, ‘authors’, ‘category’, ‘image’, ‘links’];
}

protected $fillable signifie en français “protégé remplissable” : –  protected : protège notre modèle du remplissage en masse et $fillable : seuls les champs que vous mettez dans $fillable peuvent être manipulées.

 

Création du contrôleur et des routes

Terminal : – php artisan make:controller BooksController –resource ( –>> Controller [app/Http/Controllers/BooksController.php] created successfully. ) 

Nouveau fichier contrôleur génère dans le répertoire app/Http/Controllers/. (SANS INSTRUCTIONS)

La class ProduitController définit un ensemble de méthodes qui seront utilisées pour les opérations CRUD sur le modèle Produit Il y en a 7 :

  1. index() affiche la liste des produits
  2. create() affiche le formulaire pour créer un produit
  3. store() crée un produit dans la base de données
  4. show() affiche un produit spécifique
  5. edit() affiche le formulaire pour éditer un produit
  6. update() met à jour un produit dans la base de données
  7. destroy() supprime un produit spécifique

Pour l’instant, ces fonctions sont n’ont pas d’instructions.

Définition du Routage

Ouvrir le fichier routes/web.php  et importer la classe BooksController et en bas, définir l’url “books” grâce à la méthode. ( Route::resource : )

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\BooksController;

Route::get(‘/’, function () {

return view(‘welcome’);

});

//Notre nouvelle page contact

Route::get(‘/contact’, function () {

return view(‘contact’);

});

Route::resource(‘books’, BooksController::class);  

// Route::resource est un contrôleur qui génère les routes de base pour l’application.Ils peuvent être gérer à l’aide de la classe du contrôleur BooksController

 

Ajouter une Page contact : « Laravel Mail »

Créer la route  –>> dans le fichier routes/web.php :

use App\Http\Controllers\ContactController;

Route::get(‘/contact’, [ContactController::class, ‘index’])->name(‘contact’);
Route::post(‘/contact’, [ContactController::class, ‘store’])->name(‘contact.store’);

Créer le contrôleur –>> Générez un contrôleur

php artisan make:controller ContactController

Ouvrir le fichier app/Http/Controllers/ContactController.php et ajoutez-y les méthodes suivantes :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ContactController extends Controller
{
public function index()
{
return view(‘contact’); // Retourne la vue « contact.blade.php »
}

public function store(Request $request)
{
// Valider les données
$request->validate([
‘name’ => ‘required|string|max:255’,
’email’ => ‘required|email|max:255’,
‘message’ => ‘required|string’,
]);

// Enregistrer ou envoyer le message
// Exemple d’envoi par e-mail :
// Mail::to(‘admin@example.com’)->send(new ContactMail($request->all()));

return redirect()->route(‘contact’)->with(‘success’, ‘Votre message a été envoyé avec succès.’);
}
}

 

Créer la vue — > contact.blade.php dans le dossier resources/views :

<!DOCTYPE html>
<html lang= »en »>
<head>
<meta charset= »UTF-8″>
<meta name= »viewport » content= »width=device-width, initial-scale=1.0″>
<title>Contactez-nous</title>
</head>
<body>
<h1>Contactez-nous</h1>

@if (session(‘success’))
<p style= »color: green; »>{{ session(‘success’) }}</p>
@endif

<form action= »{{ route(‘contact.store’) }} » method= »POST »>
@csrf
<div>
<label for= »name »>Nom :</label>
<input type= »text » id= »name » name= »name » value= »{{ old(‘name’) }} »>
@error(‘name’)
<p style= »color: red; »>{{ $message }}</p>
@enderror
</div>

<div>
<label for= »email »>Email :</label>
<input type= »email » id= »email » name= »email » value= »{{ old(’email’) }} »>
@error(’email’)
<p style= »color: red; »>{{ $message }}</p>
@enderror
</div>

<div>
<label for= »message »>Message :</label>
<textarea id= »message » name= »message »>{{ old(‘message’) }}</textarea>
@error(‘message’)
<p style= »color: red; »>{{ $message }}</p>
@enderror
</div>

<button type= »submit »>Envoyer</button>
</form>
</body>
</html>

Accédez à la page de contact via http://127.0.0.1:8000/contact.

Personnalisation avec un e-mail

Créez un mailable avec la commande suivante :

php artisan make:mail ContactMail

Ensuite, configurez l’envoi dans la méthode store du contrôleur :

use App\Mail\ContactMail;
use Illuminate\Support\Facades\Mail;

Mail::to(‘admin@example.com’)->send(new ContactMail($request->all()));
Et personnalisez le mailable dans app/Mail/ContactMail.php.

Comment afficher la liste de toutes les routes

Terminal  –> php artisan route:list

GET|HEAD / ……………………………………………………………………………………..
GET|HEAD books …………………………………………………. books.index › BooksController@index
POST books …………………………………………………. books.store › BooksController@store
GET|HEAD books/create …………………………………………. books.create › BooksController@create
GET|HEAD books/{book} …………………………………………….. books.show › BooksController@show
PUT|PATCH books/{book} …………………………………………. books.update › BooksController@update
DELETE books/{book} ……………………………………….. books.destroy › BooksController@destroy
GET|HEAD books/{book}/edit ………………………………………… books.edit › BooksController@edit
GET|HEAD contact …………………………………………………. contact › ContactController@index
POST contact ……………………………………………. contact.store › ContactController@store
GET|HEAD storage/{path} …………………………………………………………….. storage.local
GET|HEAD up …………………………………………………………………………………….

Showing [12] routes

 

Création des views « template Blade »

dans le dossier resources/views nous allons  ajouter un nouveau dossier nommé books.

Dans ce dossier books, nous ajoutons 4 fichiers :

index.blade.php : affiche la liste des produits

create.blade.php : affiche un formulaire pour ajouter un produit

show.blade.php : affiche un produit spécifique

edit.blade.php : affiche un formulaire pour éditer un produit

Dans le dossier resources/views nous ajoutons égalment un nouveau fichier layout.blade.php

et le code suivant :

<!DOCTYPE html>
<html>
<head>
<meta charset=« utf-8 »>
<meta name=« viewport » content=« width=device-width, initial-scale
<meta http-equiv= »X-UA-Compatible«  content=« ie=edge »>
<title>Application Laravel Crud</title>
<link href=« https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css »
rel=« stylesheet »
integrity=« sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65 »
crossorigin=« anonymous »>
</head>
<body>
<div class=« container »>
@yield(‘content’)
</div>
<script
src=« https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js »
integrity=« sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4 »
crossorigin=« anonymous »></script>
</body>
</html>

Note :

Dans ce code le marqueur @yield(‘content’). Ce marqueur indique que si un fichier utilise le marqueur @extend(‘layout’), alors le framework va chercher dans ce même fichier une section de balisage identifiée comme @section(‘content’) et insère ensuite le dans le fichier layout.blade.php à la place de @yield(‘content’).

 

 

 

Architecture Laravel 11

nom_du_projet/
├── app/
│ ├── Http/
│ │ ├── Controllers/
│ │ ├── Controller.php
│ ├── Models/
│ │ ├── User.php
│ ├── Providers/
│ │ ├── AppServiceProvider.php
├── bootstrap/
│ ├── app.php
│ ├── providers.php
│ ├── cache/
│ │ ├── packages.php
│ │ ├── services.php
│ │ ├── .gitignore
├── config/
│ ├── app.php
│ ├── auth.php
│ ├── cache.php
│ ├── database.php
│ ├── files systems.php
│ ├── logging.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
├── database/
│ ├── factories/
│ │ ├── UserFactory.php
│ ├── migrations/
│ │ ├── 2024_12_05_000000_create_users_table.php
│ │ ├── 2024_12_05_000001_create_password_resets_table.php
│ ├── seeders/
│ │ ├── DatabaseSeeder.php
├── public/
│ ├── index.php
│ ├── .htaccess
│ ├── robots.txt
│ ├── css/
│ ├── js/
│ ├── favicon.ico
├── resources/
│ ├── css/
│ │ ├── app.css
│ ├── js/
│ │ ├── app.js
│ │ ├── boostrap.js
│ ├── views/
│ │ ├── welcome.blade.php
│ │ ├── layouts/
│ │ ├── app.blade.php
│ │ ├── components/
│ │ ├── navbar.blade.php
├── routes/
│ ├── web.php
│ ├── console.php
├── storage/
│ ├── app/
│ │ ├── public/
│ │ ├──gitignore
│ │ ├── private/
│ │ ├──gitignore
│ │ ├── .gitignore
│ ├── framework/
│ │ ├── cache/
│ │ ├──data/
│ │ ├──gitignore
│ │ ├──gitignore
│ │ ├── sessions/
│ │ ├──gitignore
│ │ ├── views/
│ │ ├──gitignore
│ ├── logs/
│ ├── .gitignore
├── tests/
│ ├── Feature/
│ │ ├── ExampleTest.php
│ ├── Unit/
│ │ ├── ExampleTest.php
│ ├── TestCase.php
├── vendor/
├── .env
├── .env.example
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── README.md
├── webpack.mix.js