Module 4Administrer un site à l'aide d'un CMS
Chapitre 17 sur 17
Examen blanc et fiche mémo
Un examen blanc corrigé de 40 points et la fiche mémo de tout le module.
- ≈ 75 min
- 1 leçon
- 3 exercices
- TP
Module 4Administrer un site à l'aide d'un CMS
Chapitre 17 sur 17
Un examen blanc corrigé de 40 points et la fiche mémo de tout le module.
Objectifs
Avec ce chapitre, tu sauras…
Leçon 1
Une agence de Marrakech veut une application Laravel pour gérer des événements (concerts, ateliers) et leurs réservations. Un événement a un titre, une date, un lieu, un prix et un nombre de places ; il appartient à une catégorie. Un utilisateur connecté réserve un ou plusieurs billets. Les organisateurs (rôle organisateur) gèrent les événements ; les clients ne voient que leurs réservations.
(1) Écrivez la ReservationPolicy (un client voit et annule seulement ses réservations ; un organisateur voit tout) et son utilisation dans le contrôleur. (3 pts) (2) Écrivez le middleware EnsureUserHasRole et son enregistrement comme alias role. (3 pts) (3) Le blog de l'agence est sous WordPress : citez quatre mesures de sécurité et décrivez une stratégie de sauvegarde. (2 pts) (4) Expliquez à quoi sert un thème enfant et donnez l'en-tête de son style.css. (2 pts)
(1) Citez les trois rôles du modèle MVC et l'élément que Laravel ajoute avant le contrôleur. (1 pt) (2) Où déclare-t-on un middleware global en Laravel 13 ? (1 pt) (3) Expliquez l'attaque CSRF et la protection de Laravel. (1,5 pt) (4) Différence entre {{ }} et {!! !!} ? (1 pt) (5) Différence entre hachage et chiffrement, avec la façade de chacun. (1,5 pt) (6) Qu'est-ce que le problème N+1 et comment l'éviter ? (1 pt) (7) Citez trois rôles WordPress et ce que chacun peut faire. (1 pt)
(1) Écrivez les migrations categories (id, nom unique), evenements (id, titre, slug unique, date_debut, lieu, prix décimal, places entier positif, categorie_id supprimé en cascade, horodatage) et reservations (id, user_id, evenement_id, nb_billets, horodatage). (4 pts) (2) Écrivez les modèles Evenement et Reservation avec $fillable, casts et relations. (3 pts) (3) Donnez la commande qui reconstruit la base et la remplit. (1 pt)
L'essentiel du chapitre
laravel new app / composer create-project laravel/laravel app ; .env (jamais versionné, APP_DEBUG=false en production) ; bootstrap/app.php (routes, middlewares, exceptions) ; seul public/ est exposé ; PHP 8.3+ pour Laravel 13.serve, route:list, make:model X -mfsc, make:controller X --resource --model=X --requests, make:middleware, make:request, make:policy --model, make:component, migrate, migrate:fresh --seed, tinker, storage:link, optimize, test.Route::get|post|put|patch|delete, paramètres {x}, {x?}, where, ->name(), route('nom', $p), groupes prefix/name/middleware/controller, liaison {livre:slug}, Route::resource (7 actions), apiResource, fallback, @method('DELETE').handle(Request, Closure $next), return $next($request) ; append, alias, web(append:) dans bootstrap/app.php ; auth, guest, can, throttle, verified, signed ; paramètres role:a,b ; terminate.@csrf, 419, PreventRequestForgery, X-CSRF-TOKEN, X-XSRF-TOKEN, exclusions preventRequestForgery(except:).input, query, boolean, integer, only, filled, old(), file()->store('dossier', 'public') ; validation validate([...]), Form Request (authorize, rules, validated()), @error.view, json, redirect()->route()->with(), back()->withInput()->withErrors(), download, file, abort(404), codes 200/201/204/302/401/403/404/419/422/429.{{ }} (échappé), @if, @foreach, @forelse/@empty, $loop, @auth, @can, @extends/@section/@yield, @include, composants <x-nom> (@props, $slot), @vite, {{ $items->links() }}.foreignId()->constrained()->cascadeOnDelete(), pivot a_b), seeders, fabriques, Query Builder (where, join, when, paginate, DB::transaction), liaisons contre l'injection SQL.$fillable, casts(), find/findOrFail/create/update/delete, SoftDeletes, portées scopeX, hasMany/belongsTo/belongsToMany (sync, withPivot), with() contre N+1, withCount, whereHas.Auth::attempt + session()->regenerate(), Auth::logout + invalidate + regenerateToken ; Hash::make/check ; Crypt::encryptString ; Gates, Policies, Gate::authorize(), @can ; Sanctum auth:sanctum.theme.json) et classiques, thème enfant (Template:), extensions, sécurité, sauvegardes (base + wp-content), WP-CLI, /wp-json/wp/v2/posts.(1) Écrivez les routes : liste publique /evenements, fiche par slug, réservation (POST, connecté), « mes réservations » (connecté), et la ressource d'administration admin/evenements protégée par auth et role:organisateur. (3 pts) (2) Écrivez la Form Request StoreEvenementRequest (titre requis ≤ 150, date future, prix ≥ 0, places ≥ 1, catégorie existante). (3 pts) (3) Écrivez ReservationController@store : valider nb_billets (1 à 10), vérifier les places restantes dans une transaction, créer la réservation, rediriger avec un message. (4 pts) (4) Écrivez la vue evenements/index.blade.php qui hérite d'un layout, affiche les événements paginés (titre, date au format jj/mm/aaaa, prix, catégorie) avec un message si la liste est vide. (4 pts)