Expert Laravel - Tech Lead & Architecture applicative
10 ans de pratique intensive de Laravel dans des contextes exigeants : SaaS à fort trafic, refactoring de systèmes hérités, conception d'architectures évolutives. Je ne me contente pas d'écrire du code - je structure des systèmes qui tiennent dans la durée.
Ce que "expert Laravel" signifie concrètement
Maîtriser Laravel ne se résume pas à utiliser Eloquent et des routes. Un expert connaît les internals du framework, sait quand en sortir et comment structurer une application pour qu'elle ne devienne pas une dette technique en 18 mois.
Architecture hexagonale appliquée à Laravel
Séparation stricte entre le domaine métier et l'infrastructure Laravel. Les contrôleurs orchestrent, ils ne contiennent pas de logique. Les services de domaine sont testables sans framework.
// app/Domain/Billing/Actions/CreateInvoice.php
final class CreateInvoice
{
public function __construct(
private readonly InvoiceRepository $invoices,
private readonly EventDispatcher $events,
) {}
public function execute(CreateInvoiceData $data): Invoice
{
$invoice = Invoice::create($data);
$this->invoices->save($invoice);
$this->events->dispatch(new InvoiceCreated($invoice));
return $invoice;
}
}
DDD & Value Objects en PHP
Les concepts DDD s'appliquent pragmatiquement dans Laravel : Value Objects immuables, Aggregates, Domain Events. Pas besoin d'un framework DDD complet - PHP 8 fournit tout ce qu'il faut.
final readonly class Money
{
public function __construct(
public readonly int $amount,
public readonly string $currency,
) {
if ($this->amount < 0) {
throw new InvalidArgumentException('Amount cannot be negative.');
}
}
public function add(Money $other): self
{
if ($this->currency !== $other->currency) {
throw new CurrencyMismatchException();
}
return new self($this->amount + $other->amount, $this->currency);
}
}
Migrations sans downtime
Sur un système en production avec des milliers d'utilisateurs, une migration mal écrite provoque une indisponibilité. Stratégies : colonnes nullable d'abord, backfill en job, suppression de l'ancienne colonne en dernier.
// Étape 1 : ajouter la colonne nullable
Schema::table('users', function (Blueprint $table) {
$table->string('display_name')->nullable()->after('name');
});
// Étape 2 : backfill en batch via un job
User::query()
->whereNull('display_name')
->chunkById(500, function ($users) {
$users->each(fn ($u) => $u->update([
'display_name' => $u->name,
]));
});
// Étape 3 (déploiement suivant) : rendre NOT NULL
$table->string('display_name')->nullable(false)->change();
CQRS léger avec Laravel
Séparer les lectures des écritures sans sur-engineering : des Query classes pour les lectures complexes, des Command classes pour les mutations. Améliore la lisibilité et facilite l'optimisation des requêtes indépendamment.
// Query : optimisée pour la lecture, jamais de side effect
final class GetInvoiceSummary
{
public function execute(int $clientId): InvoiceSummaryData
{
return InvoiceSummaryData::fromRow(
DB::selectOne(
'SELECT COUNT(*) as total, SUM(amount) as revenue
FROM invoices WHERE client_id = ? AND status = ?',
[$clientId, 'paid']
)
);
}
}
Audit de code Laravel : ce que j'examine
Un audit couvre l'architecture globale, la qualité du code, la couverture de tests, la gestion des erreurs, la sécurité et les performances. La sortie est un rapport actionnable, priorisé par impact.
Architecture et structure
Fat controllers, couplage fort, absence de couche service, logique métier dans les vues ou les migrations.
Performances et requêtes SQL
N+1, requêtes sans index, eager loading manquant, scopes non optimisés, absence de cache sur les données froides.
Sécurité
Mass assignment non protégé, autorisation manquante sur les routes, injections, tokens exposés, rate limiting absent.
Qualité et testabilité
Absence de tests, couplage trop fort pour les mocks, dépendances instanciées directement dans les méthodes.
Avant - Anti-pattern
// Fat controller avec logique métier mélangée
public function store(Request $request)
{
$validated = $request->validate(['amount' => 'required|integer']);
// Logique métier dans le contrôleur
$invoice = new Invoice();
$invoice->amount = $validated['amount'];
$invoice->status = 'pending';
$invoice->user_id = auth()->id(); // couplage direct
$invoice->save();
// Notification inline
Mail::to($request->user())->send(new InvoiceCreatedMail($invoice));
return redirect()->back();
}
Après - Structuré
// Contrôleur mince, Action testable
public function store(CreateInvoiceRequest $request, CreateInvoice $action): RedirectResponse
{
$action->execute(CreateInvoiceData::fromRequest($request));
return redirect()->route('invoices.index');
}
Questions fréquentes
Quelle version de Laravel utilisez-vous ?
Je travaille en priorité sur Laravel 11 et 12 (LTS) avec PHP 8.3 ou 8.4. Pour les projets existants, j'interviens aussi sur des versions antérieures avec un plan de migration clair vers la version courante.
Travaillez-vous avec des équipes en place ?
Oui. La majorité de mes missions se font en intégration dans une équipe existante : code reviews, pair programming, mise en place de standards, onboarding sur les patterns choisis. Je transfère les compétences autant que je livre du code.
Intervenez-vous uniquement sur Laravel ou aussi sur l'infrastructure ?
Je couvre l'application Laravel, la base de données (PostgreSQL/MySQL), la configuration Redis et Horizon, et le déploiement AWS (ECS, RDS, S3, SQS). Je ne fais pas de devops pur (Terraform, Kubernetes à grande échelle) mais je sais dialoguer avec un SRE et concevoir l'architecture cloud adaptée à une application Laravel.
Besoin d'un expert Laravel pour un audit ou une mission ?
Remote, hybride ou sur site en France. Disponible rapidement.