Laravel

Laravel 11: Créer des Applications Web Extraordinaires

Default Cover
Auteur MEME
Date 07 mars 2026
Lecture 3 min
Vues 23

Laravel 11: Créer des Applications Web Extraordinaires
Laravel est la solution parfaite pour construire des applications web professionnelles avec PHP.

Installation et Configuration

# Installer Laravel
composer create-project laravel/laravel mon-app
cd mon-app

# Ou avec Laravel Installer
composer global require laravel/installer
laravel new mon-app

# Configurer l'environnement
cp .env.example .env
php artisan key:generate

# Démarrer
php artisan serve
# http://localhost:8000

Routing - Définir les URLs

// routes/web.php

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

// Routes simples
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
Route::get('/posts/{id}', [PostController::class, 'show'])->name('posts.show');
Route::put('/posts/{id}', [PostController::class, 'update'])->name('posts.update');
Route::delete('/posts/{id}', [PostController::class, 'destroy'])->name('posts.destroy');

// Resource shortcut (CRUD automatique)
Route::resource('posts', PostController::class);

// Groupes de routes
Route::prefix('admin')->middleware(['auth', 'admin'])->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::resource('users', UserController::class);
});

// Routes protégées
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
});

Modèles et Eloquent ORM

# Créer un modèle avec migration
php artisan make:model Post -m

# Créer un modèle avec factory et seeder
php artisan make:model Post -mfs

// app/Models/Post.php

namespace App\Models;

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

class Post extends Model
{
use HasFactory;

protected $fillable = ['title', 'content', 'user_id'];

// Relation: Un Post appartient à un User
public function user()
{
return $this->belongsTo(User::class);
}

// Relation: Un Post a plusieurs Comments
public function comments()
{
return $this->hasMany(Comment::class);
}
}

Migrations - Gérer la Base de Données

# Créer une migration
php artisan make:migration create_posts_table

// database/migrations/2024_03_07_create_posts_table.php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
$table->softDeletes();
});
}

public function down()
{
Schema::dropIfExists('posts');
}
}

// Exécuter
php artisan migrate

// Rollback
php artisan migrate:rollback

Controllers - Logique Métier

php artisan make:controller PostController --resource

// app/Http/Controllers/PostController.php

namespace App\Http\Controllers;

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

class PostController extends Controller
{
// Lister tous les posts
public function index()
{
$posts = Post::with('user')->paginate(15);
return view('posts.index', compact('posts'));
}

// Afficher le formulaire de création
public function create()
{
return view('posts.create');
}

// Sauvegarder un nouveau post
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
]);

$post = auth()->user()->posts()->create($validated);

return redirect()->route('posts.show', $post)
->with('success', 'Post créé avec succès!');
}

// Afficher un post
public function show(Post $post)
{
return view('posts.show', compact('post'));
}

// Afficher le formulaire d'édition
public function edit(Post $post)
{
return view('posts.edit', compact('post'));
}

// Mettre à jour
public function update(Request $request, Post $post)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
]);

$post->update($validated);

return redirect()->route('posts.show', $post)
->with('success', 'Post mis à jour!');
}

// Supprimer
public function destroy(Post $post)
{
$post->delete();

return redirect()->route('posts.index')
->with('success', 'Post supprimé!');
}
}

Blade - Templates

{{-- Afficher une variable --}}
<h1>{{ $post->title }}</h1>

{{-- Condition --}}
@if ($post->published)
<span class="badge">Publié</span>
@else
<span class="badge">Brouillon</span>
@endif

{{-- Boucle --}}
@foreach ($posts as $post)
<article>
<h2>{{ $post->title }}</h2>
<p>{{ $post->content }}</p>
</article>
@endforeach

{{-- Include un fichier --}}
@include('posts.card', ['post' => $post])

{{-- Form avec CSRF --}}
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<input type="text" name="title" value="{{ old('title') }}">
@error('title')
<span class="error">{{ $message }}</span>
@enderror
<button type="submit">Créer</button>
</form>

Authentification

# Installer Breeze (scaffolding d'authentification)
php artisan breeze:install

# Migrations
php artisan migrate

// Protéger les routes
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});

// Vérifier dans le controller
if (auth()->check()) {
echo "Connecté: " . auth()->user()->name;
}

// Authorisation (policies)
$this->authorize('update', $post);

Validation

$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'age' => 'integer|min:18|max:100',
'avatar' => 'image|max:2048',
'bio' => 'nullable|string|max:1000',
]);

Relations et Eager Loading

// N+1 Problem: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // N requêtes!
}

// Solution: Eager load
$posts = Post::with('user')->get(); // 2 requêtes

// Relation imbriquée
$posts = Post::with('user', 'comments.author')->get();

// Lazy eager loading
$posts = Post::all();
$posts->load('user');

API avec Laravel

// routes/api.php

Route::apiResource('posts', PostController::class);

// Controller pour API
class PostController extends Controller
{
public function index()
{
return Post::all();
}

public function store(Request $request)
{
$post = Post::create($request->validated());
return response()->json($post, 201);
}

public function show(Post $post)
{
return $post;
}

public function destroy(Post $post)
{
$post->delete();
return response()->noContent();
}
}

Ressources

Documentation: https://laravel.com/docs
Laravel News: https://laravel-news.com
Laracasts: https://laracasts.com

Connectez-vous pour participer à la discussion.

Se connecter

0 Commentaires

Aucun commentaire pour le moment. Soyez le premier !

Voir tous les articles