optimitzar imatges en laravel

optimitzar imatges en laravel

Paso 1: Instalar el Paquete spatie/laravel-image-optimizer

Primero, instala el paquete necesario usando Composer:

composer require spatie/laravel-image-optimizer

Paso 2: Crear un Comando Artisan para Optimizar las Imágenes

Vamos a crear un nuevo comando Artisan para optimizar todas las imágenes en los directorios mencionados.

  1. En la terminal, ejecuta el siguiente comando para crear el comando:
  2. php artisan make:command OptimizeImages
  3. Esto generará un archivo en app/Console/Commands/OptimizeImages.php.


Paso 3: Editar el Archivo OptimizeImages.php

Abre el archivo app/Console/Commands/OptimizeImages.php y reemplaza su contenido con el siguiente código:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use Spatie\ImageOptimizer\OptimizerChainFactory;

class OptimizeImages extends Command
{
    protected $signature = 'images:optimize';
    protected $description = 'Optimiza todas las imágenes en public/img y storage/app/public, incluyendo subdirectorios';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $optimizerChain = OptimizerChainFactory::create();

        // Optimizar imágenes en public/img y sus subdirectorios
        $publicImages = Storage::allFiles('public/img');
        foreach ($publicImages as $image) {
            $this->optimizeImage($image, $optimizerChain);
        }

        // Optimizar imágenes en storage/app/public y sus subdirectorios
        $storageImages = Storage::allFiles('public');
        foreach ($storageImages as $image) {
            $this->optimizeImage($image, $optimizerChain);
        }

        $this->info('Todas las imágenes han sido optimizadas.');
    }

    protected function optimizeImage($image, $optimizerChain)
    {
        if (preg_match('/\.(jpg|jpeg|png|gif|svg)$/i', $image)) {
            $optimizerChain->optimize(Storage::path($image));
            $this->info("Optimized: $image");
        }
    }
}

Paso 4: Ejecutar el Comando

Después de guardar el archivo, puedes optimizar todas las imágenes ejecutando el siguiente comando en la terminal:

php artisan images:optimize

Explicación

  • $optimizerChain = OptimizerChainFactory::create();: Crea una cadena de optimizadores que procesará cada imagen para reducir su tamaño sin perder calidad perceptible.
  • Storage::allFiles('public/img'); y Storage::allFiles('public');: Estos métodos obtienen todas las rutas de los archivos dentro de public/img y storage/app/public, incluyendo los subdirectorios.
  • preg_match('/\.(jpg|jpeg|png|gif|svg)$/i', $image): Filtra las imágenes para asegurarse de que solo se optimizan archivos de imagen comunes.
  • $optimizerChain->optimize(Storage::path($image));: Optimiza la imagen en la ruta dada.

Paso 5: Programar la Ejecución Automática (Opcional)

Si deseas que este proceso se ejecute automáticamente, puedes agregarlo al cron de Laravel. Abre app/Console/Kernel.php y agrega lo siguiente al método schedule:

protected function schedule(Schedule $schedule)
{
    $schedule->command('images:optimize')->weekly();
}

Resumen

  • Archivo creado: app/Console/Commands/OptimizeImages.php
  • Comando para ejecutar: php artisan images:optimize

Este comando optimizará todas las imágenes en los directorios especificados, lo que puede mejorar significativamente el rendimiento de tu aplicación.