andydefer / laravel-utils
Utility package for Laravel including Transformable proxies and helpers
Requires
- php: ^8.1
- andydefer/laravel-task: ^4.11.1
- laravel/framework: ^12.0|^13.0|^14.0|^15.0
Requires (Dev)
- laravel/pint: ^1.29
- mockery/mockery: ^1.6
- orchestra/testbench: ^9.0|^10.0
- phpunit/phpunit: ^10.5|^11.0|^12.0
This package is auto-updated.
Last update: 2026-08-08 18:23:22 UTC
README
Table des matières
- Description
- Installation
- Prérequis
- Fonctionnalités
- Configuration
- Documentation
- Tests
- Contribuer
- Licence
- Auteur
- Dépendances
Description
Package d'utilitaires pour Laravel offrant des proxies pour l'hydratation automatique d'objets Transformable (Value Objects, Records, DTOs) depuis des sources variées (tableaux, JSON, colonnes de base de données) ainsi que des directives CLI pour automatiser les workflows Git (push, génération de diff pour revue IA, et versionnement sémantique).
Installation
composer require andydefer/laravel-utils
Publication de la configuration (optionnelle)
Pour personnaliser les paramètres du package (dépôts Git, extensions, etc.) :
php artisan vendor:publish --tag=utils-config
Cette commande publiera le fichier config/utils.php dans votre application.
Note : La publication de la configuration n'est pas obligatoire. Si vous ne publiez pas le fichier, le package utilisera les valeurs par défaut.
Prérequis
- PHP 8.1 ou supérieur
- Laravel 10.x, 11.x, 12.x, 13.x, 14.x ou 15.x
andydefer/domain-structures^1.0- Git (pour les directives CLI)
- VS Code (optionnel, pour l'ouverture automatique des fichiers)
Fonctionnalités
TransformableProxy
Proxy statique pour créer des objets Transformable depuis diverses sources :
use AndyDefer\LaravelUtils\Proxies\TransformableProxy; use App\ValueObjects\SlugVO; // Depuis une chaîne $slug = TransformableProxy::make(SlugVO::class, 'mon-slug'); // Depuis un tableau $user = TransformableProxy::make(UserRecord::class, [ 'name' => 'John Doe', 'email' => 'john@example.com', ]); // Depuis du JSON $product = TransformableProxy::make(ProductRecord::class, '{"name":"Laptop","price":999}'); // Avec nullable $coordinates = TransformableProxy::make(CoordinatesVO::class, null, nullable: true);
AttributeProxy
Proxy pour créer des attributs Eloquent qui hydratent automatiquement des objets Transformable depuis les colonnes de base de données.
Méthodes disponibles
| Méthode | Description |
|---|---|
required() |
Attribut requis (non-nullable) |
nullable() |
Attribut nullable |
make() |
⚠️ Dépréciée - Utiliser required() ou nullable() |
Exemple d'utilisation
use AndyDefer\LaravelUtils\Proxies\AttributeProxy; use App\ValueObjects\SlugVO; use App\ValueObjects\CoordinatesVO; use App\Records\SettingsRecord; class User extends Model { // Attribut nullable (slug) protected function slug(): Attribute { return AttributeProxy::nullable(SlugVO::class, column: 'slug'); } // Attribut required (coordinates) protected function coordinates(): Attribute { return AttributeProxy::required(CoordinatesVO::class, column: 'coordinates'); } // Attribut nullable avec colonne différente protected function settings(): Attribute { return AttributeProxy::nullable(SettingsRecord::class, column: 'metadata'); } // Attribut avec transformation personnalisée protected function customSlug(): Attribute { return AttributeProxy::nullable( SlugVO::class, column: 'slug', get: function ($value, $attributes) { return strtolower(trim($value)); }, set: function ($value) { return ['slug' => strtolower(trim($value))]; } ); } } // Utilisation $user = User::find(1); echo $user->slug->getValue(); // 'john-doe' echo $user->coordinates->getLatitude()->getValue(); // 48.8566 echo $user->settings->theme; // 'dark'
Gestion automatique du Set
Lorsque vous spécifiez une colonne (column), AttributeProxy gère automatiquement la persistance :
class Product extends Model { protected function slug(): Attribute { // Le set est automatiquement géré return AttributeProxy::nullable(SlugVO::class, column: 'slug'); } } // La valeur est automatiquement normalisée avant stockage $product->slug = 'Mon Article'; // Stocké comme 'mon-article'
GitPushDirective
Directive CLI pour pousser du code vers des dépôts Git distants configurés avec mode interactif et options avancées.
# Mode interactif (demande le message, les cibles et les dossiers) ./bin/afya ugp # Push avec simulation (dry-run) ./bin/afya ugp [github] --dry-run <message="Fix bug"> # Push avec force-with-lease ./bin/afya ugp [github] --force-with-lease <message="Hotfix"> # Push sans tests ./bin/afya ugp [github, o2switch] --no-tests <message="Feature: Ajout API">
Paramètres :
| Paramètre | Description |
|---|---|
{sources*} |
Alias des dépôts configurés (vide = push vers tous) |
{folders*} |
Dossiers à ajouter (vide = tous les fichiers) |
--no-tests |
Ignorer l'exécution des tests |
--force-with-lease |
Utiliser --force-with-lease au lieu de --force |
--force |
Forcer le push même si les tests échouent |
--no-interactive |
Désactiver le mode interactif |
--dry-run |
Simuler l'opération sans rien exécuter |
GitDiffDirective
Directive CLI pour générer un diff Git formaté pour la revue de code par IA.
# Génération simple (interactif) ./bin/afya ugd # Génération non-interactive avec chemins et extensions ./bin/afya ugd [src, tests] [.php, .js] --no-interactive # Utilisation des recettes d'extensions ./bin/afya ugd --frontend # Frontend uniquement ./bin/afya ugd --backend # Backend uniquement ./bin/afya ugd --recipes # Sélection interactive des recettes # Simulation (dry-run) ./bin/afya ugd [src] --dry-run # Génération avec résumé de travail ./bin/afya ugd [src] --with-summary
Paramètres :
| Paramètre | Description |
|---|---|
{paths*} |
Chemins à inclure (ex: [src, tests]) |
{extensions*} |
Extensions à filtrer (ex: [.php, .js]) |
--frontend |
Utiliser les extensions frontend de la config |
--backend |
Utiliser les extensions backend de la config |
--recipes |
Sélectionner les recettes d'extensions interactivement |
--with-summary |
Créer un résumé de travail après le diff |
--no-interactive |
Désactiver le mode interactif |
--dry-run |
Simuler l'opération sans écrire de fichier |
Recettes d'extensions par défaut :
| Recette | Extensions |
|---|---|
frontend |
js, ts, tsx, jsx, vue, css, scss, sass, less, html, xml |
backend |
php, py, rb, go, rs, java, c, cpp, h, hpp |
GitTagDirective
Directive CLI pour créer des tags de version Git avec versioning sémantique (SemVer).
# Création d'un tag patch (défaut) ./bin/afya ugt # Création d'un tag minor ./bin/afya ugt minor # Création d'un tag major ./bin/afya ugt major # Re-publication du dernier tag ./bin/afya ugt --republish # Tag avec message personnalisé et simulation ./bin/afya ugt patch --dry-run <message="Release v1.0.1"> # Tag sans push automatique ./bin/afya ugt minor --no-push
Paramètres :
| Paramètre | Description |
|---|---|
{type} |
Type de tag : patch, minor, major (défaut: patch) |
--no-push |
Ne pas pousser le tag vers le dépôt distant |
--republish |
Re-publier le dernier tag (force push) |
--dry-run |
Simuler l'opération sans rien exécuter |
{message} |
Message personnalisé pour le tag |
Fonctionnalités :
- Versionnement sémantique automatique (SemVer)
- Message personnalisé pour les tags
- Simulation (dry-run) sans effectuer de modifications
- Re-publication forcée des tags existants
- Gestion des erreurs et des cas limites
- Interface utilisateur enrichie avec couleurs et icônes
Exemple de sortie :
🏷️ GIT TAG
📋 Configuration:
🏷️ Type minor
📦 Last tag v0.1.0
🆕 New tag v0.2.0
💬 Message Version 0.2.0 - Ajout de nouvelles fonctionnalités
📤 Push ✅ Yes
📦 Creating tag: v0.2.0
✅ Tag created: v0.2.0
📤 Pushing tag to remote...
✅ Tag pushed: v0.2.0
✅ Tag operation completed successfully!
Configuration
Publication de la configuration
Pour personnaliser les paramètres du package, publiez d'abord le fichier de configuration :
php artisan vendor:publish --tag=utils-config
Cette commande crée le fichier config/utils.php dans votre application.
Configuration des dépôts Git
// config/utils.php return [ 'repositories' => [ 'github' => 'git@github.com:andydefer/laravel-utils.git', 'o2switch' => 'ssh://user@domain.com/home/user/git/repo.git', ], ];
Configuration des extensions
// config/utils.php return [ // Extensions par défaut pour le diff 'default_extensions' => ['php', 'js', 'ts', 'css', 'html', 'json', 'yaml', 'md'], // Recettes d'extensions 'extension_recipes' => [ 'frontend' => ['js', 'ts', 'tsx', 'jsx', 'vue', 'css', 'scss', 'sass', 'less', 'html', 'xml'], 'backend' => ['php', 'py', 'rb', 'go', 'rs', 'java', 'c', 'cpp', 'h', 'hpp'], 'fullstack' => ['php', 'js', 'ts', 'tsx', 'jsx', 'vue', 'css', 'scss', 'html'], ], ];
Configuration du déploiement
// config/utils.php return [ // ... autres configurations ... 'deployment' => [ 'ssh_key' => env('DEPLOY_SSH_KEY', 'o2switch'), 'remote_path' => env('DEPLOY_REMOTE_PATH', '~/sites/laravel-utils.com'), 'git_branch' => env('DEPLOY_GIT_BRANCH', 'master'), ], ];
Documentation
- TransformableProxy - Référence Technique
- AttributeProxy - Référence Technique
- GitPushDirective - Référence Technique
- GitDiffDirective - Référence Technique
- GitTagDirective - Référence Technique
Tests
composer test
Contribuer
- Forker le projet
- Créer une branche (
git checkout -b feature/ma-fonctionnalite) - Commiter les changements (
git commit -m 'Ajout de ma fonctionnalité') - Pusher (
git push origin feature/ma-fonctionnalite) - Ouvrir une Pull Request
Licence
MIT © Andy Defer
Auteur
- Andy Defer - GitHub
Dépendances
andydefer/domain-structures- Interfaces et classes de base pour les objets transformablesilluminate/database- Pour les attributs Eloquentsymfony/process- Pour l'exécution des commandes Gitandydefer/laravel-directive- Pour l'infrastructure des directives CLIandydefer/console-writer- Pour l'interface utilisateur en CLI