1. Go to this page and download the library: Download andydefer/laravel-images library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
andydefer / laravel-images example snippets
// config/images.php
return [
// Driver du processeur d'images
'driver' => env('IMAGE_DRIVER', 'gd'), // ou 'imagick'
// Disque de stockage
'disk' => env('IMAGE_DISK', 'public'),
];
use AndyDefer\LaravelImages\Models\Image;
// Propriétés principales
$image->id; // UUID unique
$image->path; // Chemin relatif (ImagePathVO)
$image->filename; // Nom du fichier
$image->original_filename; // Nom original
$image->extension; // Extension (jpg, png, etc.)
$image->mime_type; // Type MIME
$image->size; // Taille en bytes
$image->type; // Type d'image (avatar, cover, gallery, etc.)
$image->metadata; // Métadonnées (ImageMetadataVO)
$image->is_primary; // Image principale
$image->is_processed; // Traitée ou non
$image->order; // Ordre d'affichage
$image->inverse_image_id; // UUID de l'image inverse (light/dark)
use AndyDefer\LaravelImages\Models\Album;
$album->id; // UUID unique
$album->name; // Nom de l'album
$album->slug; // Slug unique
$album->description; // Description
$album->is_public; // Public ou privé (BinaryChoice)
$album->is_featured; // Mis en avant (BinaryChoice)
$album->images; // Images de l'album
$album->coverImage; // Image de couverture
use AndyDefer\LaravelImages\Models\Image;
use AndyDefer\LaravelImages\Models\Album;
class User extends Model
{
// Une image s'attache à n'importe quel modèle via imageable()
// Un album s'attache à n'importe quel modèle via albumable()
}
namespace App\Models;
use AndyDefer\LaravelImages\Traits\HasMediables;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasMediables;
// Aucune relation nécessaire !
// Les attributs sont disponibles directement
}
$user = User::find(1);
// Vérifier si l'utilisateur a des images
if ($user->has_images) {
echo "L'utilisateur a {$user->images_count} images";
}
// Récupérer l'avatar
$avatar = $user->avatar;
if ($avatar) {
echo $avatar->full_url;
}
// Récupérer les albums publics
foreach ($user->public_albums as $album) {
echo $album->name;
}
use AndyDefer\LaravelImages\Services\ImageService;
use AndyDefer\LaravelImages\Enums\ImageType;
use AndyDefer\LaravelImages\Records\ImageOptionsRecord;
$imageService = app(ImageService::class);
// Upload simple
$image = $imageService->upload(
$request->file('avatar'),
$user, // Modèle parent (polymorphique)
auth()->user(), // Uploadé par
ImageType::AVATAR,
new ImageOptionsRecord(
alt_text: 'Photo de profil',
is_primary: true,
generate_thumbnails: true,
)
);
// Toutes les images d'un modèle
$images = $imageService->getImagesForModel($post);
// Images d'un type spécifique
$avatars = $imageService->getImagesForModel($user, ImageType::AVATAR);
// Image principale
$primary = $imageService->getPrimaryImage($user);
// Une image par UUID
$image = $imageService->findImage('550e8400-e29b-41d4-a716-446655440000');
// Images mises à jour récemment
$recent = $imageService->getImagesUpdatedAfter(
DateTimeVO::from(now()->subDays(7))
);
use AndyDefer\LaravelImages\Records\ImageRecord;
// Mettre à jour les métadonnées
$image = $imageService->update(
ImageRecord::from(['metadata' => new ImageMetadataVO([
'alt_text' => 'Nouveau texte alternatif',
'caption' => 'Nouvelle légende',
])]),
$imageId
);
// Définir comme image principale
$imageService->setAsPrimary($imageId, $post);
// Réorganiser les images
$imageService->reorder(['uuid1', 'uuid2', 'uuid3']);
// Supprimer une image
$imageService->delete($imageId, deleteFile: true);
// Supprimer plusieurs images
$imageService->deleteMultiple(['uuid1', 'uuid2', 'uuid3'], deleteFile: true);
// Supprimer toutes les images d'un modèle
$imageService->deleteAllForModel($post, deleteFile: true);
// Récupérer l'URL d'une miniature
$small = $imageService->getThumbnailUrl($imageId, 'small');
$medium = $imageService->getThumbnailUrl($imageId, 'medium');
$large = $imageService->getThumbnailUrl($imageId, 'large');
// Dans un template Blade
<img src="{{ $imageService->getThumbnailUrl($image->id, 'small') }}" />
use AndyDefer\LaravelImages\Services\AlbumService;
use AndyDefer\LaravelCluster\Enums\BinaryChoice;
use AndyDefer\LaravelImages\Records\AlbumOptionsRecord;
$albumService = app(AlbumService::class);
$album = $albumService->createAlbum(
$user,
'Mes photos de vacances',
new AlbumOptionsRecord(
description: 'Photos de mon voyage en Italie',
is_public: BinaryChoice::YES,
is_featured: BinaryChoice::NO,
)
);
// Ajouter des images à un album
$albumService->addImagesToAlbum($album, ['uuid1', 'uuid2', 'uuid3', 'uuid4', 'uuid5']);
// Ajouter une image avec une position spécifique
$albumService->addImageToAlbum($album, $imageId, $order = 3);
// Réorganiser les images
$albumService->reorderAlbumImages($album, ['uuid3', 'uuid1', 'uuid4', 'uuid2', 'uuid5']);
// Retirer une image
$albumService->removeImageFromAlbum($album, $imageId);
// Vider l'album
$albumService->removeAllImagesFromAlbum($album);
// Albums d'un modèle (publics uniquement)
$albums = $albumService->getAlbumsForModel($user, onlyPublic: true);
// Tous les albums (publics et privés)
$allAlbums = $albumService->getAlbumsForModel($user, onlyPublic: false);
// Album par slug
$album = $albumService->getAlbumBySlug('mes-photos-de-vacances');
// Albums mis en avant
$featured = $albumService->getFeaturedAlbums(10);
// Définir la couverture
$albumService->setCoverImage($album, $imageId);
// Récupérer la couverture
$cover = $albumService->getAlbumCoverImage($album);
// Mettre à jour un album
$album = $albumService->updateAlbum(
$albumId,
new AlbumOptionsRecord(
name: 'Nouveau nom',
description: 'Nouvelle description',
is_public: BinaryChoice::NO,
is_featured: BinaryChoice::YES,
)
);
// Dupliquer un album
$duplicate = $albumService->duplicateAlbum($album, 'Copie - Mes photos');
// Supprimer un album
$albumService->deleteAlbum($albumId, deleteImages: true);
use AndyDefer\LaravelImages\Processors\GdImageProcessor;
$processor = new GdImageProcessor($storage, $fileSystem);
// Redimensionner une image
$resized = $processor->resize(
$imagePath, // ImagePathVO
800, // Largeur
600, // Hauteur (null = ratio conservé)
85 // Qualité (1-100)
);
echo $resized->getFullPath();
use AndyDefer\LaravelImages\Storage\LocalImageStorage;
use AndyDefer\PhpServices\Services\FileSystemService;
// Création du stockage
$fileSystem = new FileSystemService();
$storage = new LocalImageStorage($fileSystem);
// Stocker un fichier
$path = $storage->store($uploadedFile, 'users/123/avatars', 'profile.jpg');
// Vérifier l'existence
if ($storage->exists($path)) {
// Le fichier existe
}
// Obtenir le chemin complet
$fullPath = $storage->getFullPath($path);
// Lister les fichiers d'un dossier
$files = $storage->files('users/123/avatars');
// Supprimer un fichier
$storage->delete($path);
// Supprimer plusieurs fichiers
$storage->deleteMultiple($files);
// Upload de deux images variantes
$darkFile = UploadedFile::fake()->image('banner-dark.jpg');
$lightFile = UploadedFile::fake()->image('banner-light.jpg');
$darkImage = $imageService->upload($darkFile, $page, null, ImageType::BANNER);
$lightImage = $imageService->upload($lightFile, $page, null, ImageType::BANNER);
// L'ImageObserver a automatiquement lié les deux images
$darkImage->refresh();
$lightImage->refresh();
// Les relations inverses sont automatiquement synchronisées
echo $darkImage->inverse_image_id; // UUID de l'image light
echo $lightImage->inverse_image_id; // UUID de l'image dark
// Création d'un album avec des images
$album = $albumService->createAlbum($user, 'Mes photos');
$albumService->addImagesToAlbum($album, ['uuid1', 'uuid2', 'uuid3']);
// Suppression de l'album
$album->delete();
// L'AlbumObserver a automatiquement détaché toutes les images
// Les images 1, 2, 3 existent toujours mais ne sont plus liées à l'album
// Upload des deux variantes (l'ordre n'a pas d'importance)
$darkFile = UploadedFile::fake()->image('hero-dark.jpg');
$lightFile = UploadedFile::fake()->image('hero-light.jpg');
// L'Observer lie automatiquement les deux images
$darkImage = $imageService->upload($darkFile, $page, null, ImageType::BANNER);
$lightImage = $imageService->upload($lightFile, $page, null, ImageType::BANNER);
// La liaison est automatique
$darkImage->refresh();
echo $darkImage->inverse_image_id; // UUID de l'image light
// Récupérer l'image inverse via la relation Eloquent
$inverse = $darkImage->inverseImage;
echo $inverse->filename; // 'hero-light.jpg'
use AndyDefer\LaravelImages\Models\Image;
$image = Image::find('550e8400-e29b-41d4-a716-446655440000');
$imageService->syncInverseRelation($image);
// Récupérer la bonne variante selon le thème de l'utilisateur
function getThemeImage(Image $image, string $theme): ?Image
{
if ($theme === 'dark' && $image->original_filename) {
// Si l'image actuelle est light, chercher sa version dark
return $image->inverseImage ?? $image;
}
if ($theme === 'light' && $image->original_filename) {
// Si l'image actuelle est dark, chercher sa version light
return $image->inverseImage ?? $image;
}
return $image;
}
// Dans un template Blade
@php
$banner = $page->getPrimaryImage();
$displayedBanner = getThemeImage($banner, auth()->user()->theme);
@endphp
<img src="{{ $displayedBanner->full_url }}" alt="Bannière" />