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 :
- Créer un nouveau projet Laravel :
composer create-project laravel/laravel nom_du_projet - Naviguer dans le dossier du projet :
cd nom_du_projet - Lancer le serveur de développement :
php artisan serve - Accédez à votre application dans un navigateur :
http://127.0.0.1:8000
Étape 2 : Configurer le Projet
Configurer la base de données :
- Ouvrez le fichier .env à la racine du projet.
- 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= - Créez la base de données :
Connectez-vous à MySQL et créez une base de données :
CREATE DATABASE nom_de_la_base; - 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
- Laracasts
- Vidéos de haute qualité sur Laravel et son écosystème.
- Tutoriels pour tous les niveaux : débutant à avancé.
- Codecourse
- Vidéos de qualité pour apprendre Laravel et d’autres technologies connexes.
- Cas d’utilisation réels.
- FreeCodeCamp – Laravel Tutorials
- Ressources gratuites et tutoriels.
- Laravel News
- Tuts Make
- LaraShout
- Learn2torials
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
- Laravel Vapor
- Une plateforme serverless pour exécuter des applications Laravel sur AWS.
- DigitalOcean Laravel Tutorials
- Guide sur l’hébergement de Laravel sur des serveurs DigitalOcean.
Vidéos
- Traversy Media
- CodeAcademy
- Academind
- BitFumes
- Laravel Business
- Laraning
- Laravel PHP Framework Tutorial
- Let’s Buils With Laravel : A Linktree Clone
- The Laravel Podcast
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.)
Créer de modèle Laravel
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 :
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 :
- • index() affiche la liste des produits
- • create() affiche le formulaire pour créer un produit
- • store() crée un produit dans la base de données
- • show() affiche un produit spécifique
- • edit() affiche le formulaire pour éditer un produit
- • update() met à jour un produit dans la base de données
- • 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 :
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