La solution était heureusement plutôt simple, grâce à la magie de l’open source !

Le package spatie/laravel-image-optimizer fournit quasiment tout le code nécessaire pour optimiser les images avant qu’elles ne soient enregistrées par votre application. Encore mieux : on peut l’utiliser comme middleware pour automatiser le traitement !

Installation du paquet

Installer le paquet PHP est très simple, ça se passe comme d’habitude avec Composer :

composer require spatie/laravel-image-optimizer

Ensuite on peut générer le fichier de configuration, pour ceux qui voudraient un réglage différent des paramètres par défaut (c’est ce que j’ai fait pour changer la qualité souhaitée) :

php artisan vendor:publish --provider="Spatie\LaravelImageOptimizer\ImageOptimizerServiceProvider"

Le fichier config/image-optimizer.php peut alors être modifié à volonté. 😉

J’ai surtout touché à la qualité pour ne pas trop perdre sur le rendu.

À voir à l’usage si le résultat me convient, je surchargerai peut-être les valeurs selon les besoins.

Utilisation du middleware

L’intégration se fait assez facilement puisqu’un middleware est fourni.

On commence par ajouter le middleware au lancement de Laravel :

	protected $routeMiddleware = [
		// …
		'optimizeImages' => \Spatie\LaravelImageOptimizer\Middlewares\OptimizeImages::class,
		// …
	]
app/Http/Kernel.php

Et on l’utilise sur notre route :

Route::post('uploadImage', [MyController::class, 'uploadImage'])->middleware(['optimizeImages']);
routes/web.php

Configuration du serveur

Pour optimiser un maximum de formats d’image, il vaut mieux s’assurer que les bons outils sont installés sur le serveur.

Facile, Ansible est là pour ça !

---
- name: Install ImageOptimizer dependencies
  apt:
    update_cache: yes
    name:
      - jpegoptim
      - pngquant
      - optipng
      - gifsicle
      - webp
ansible/roles/image-optimizer/tasks/main.yml

On ajoute le rôle au fichier global de recette :

    - role: image-optimizer
      tags:
        - install
        - image-optimizer
ansible/install.yml

On applique le rôle, et c’est parti pour déployer le nouveau code (en n’oubliant pas de faire un composer update) !

ansible-playbook -i hosts --vault-password-file .vault-password install.yml --tags="install,image-optimizer"
ansible-playbook -i hosts --vault-password-file .vault-password deploy.yml

Et voilà, c’est publié !


Il fait chaud chez vous aussi ?
Il fait chaud chez vous aussi ?