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
Aucun commentaire pour le moment. Soyez le premier !