jdikasa / laravel-repository-pattern
Laravel package for generating Repository pattern components
Installs: 26
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/jdikasa/laravel-repository-pattern
Requires
- php: ^8.2
- illuminate/console: ^10.0|^11.0|^12.0
- illuminate/filesystem: ^10.0|^11.0|^12.0
- illuminate/support: ^10.0|^11.0|^12.0
- nesbot/carbon: ^2.0|^3.0
- spatie/laravel-fractal: ^6.3
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0|^10.0
- phpunit/phpunit: ^10.0|^11.0
README
Un package Laravel puissant pour générer automatiquement tous les composants du pattern Repository en une seule commande : Model, Repository, Service, Controller, Transformer et Requests.
✨ Fonctionnalités
- 🚀 Génération complète : Model, Repository, Service, Controller, Transformer, Requests (Store/Update)
- 🎨 Stubs personnalisables : Adaptez les templates à vos besoins
- 📁 Structure organisée : Chaque composant dans son dossier approprié
- ⚡ Une seule commande : Générez tout le pattern en une fois
- 🔧 Configuration flexible : Personnalisez les namespaces et dossiers
- 📝 Code propre : Templates respectant les bonnes pratiques Laravel
🎯 Compatibilité
| Version Package | Laravel | PHP |
|---|---|---|
| 1.x | 9.x, 10.x, 11.x | 8.0+ |
📦 Installation
composer require jdikasa/laravel-repository-pattern
Le package se configure automatiquement grâce à la découverte automatique de Laravel.
🚀 Utilisation
Commande principale
php artisan make:model-pattern Post
Cette commande génère automatiquement :
- ✅
app/Models/Post.php- Le modèle Eloquent - ✅
app/Repositories/PostRepository.php- Le repository - ✅
app/Services/PostService.php- La couche service - ✅
app/Http/Controllers/PostController.php- Le contrôleur - ✅
app/Transformers/PostTransformer.php- Le transformer - ✅
app/Http/Requests/Post/StorePostRequest.php- Request pour création - ✅
app/Http/Requests/Post/UpdatePostRequest.php- Request pour mise à jour
Options disponibles
# Forcer l'écrasement des fichiers existants
php artisan make:model-pattern Post --force
🏗️ Structure générée
app/
├── Models/
│ └── Post.php
├── Repositories/
│ └── PostRepository.php
├── Services/
│ └── PostService.php
├── Http/
│ ├── Controllers/
│ │ └── PostController.php
│ └── Requests/
│ └── Post/
│ ├── StorePostRequest.php
│ └── UpdatePostRequest.php
└── Transformers/
└── PostTransformer.php
🔧 Configuration
Publier la configuration
php artisan vendor:publish --tag=repository-pattern-config
Fichier de configuration
// config/repository-pattern.php return [ /** * Namespaces personnalisés */ 'namespaces' => [ 'repository' => 'App\\Repositories', 'service' => 'App\\Services', 'transformer' => 'App\\Transformers', 'controller' => 'App\\Http\\Controllers', 'request' => 'App\\Http\\Requests', ], /** * Répertoires de génération * * Ces repertoires doivent correspondre à vos namespaces personnalisés */ 'paths' => [ 'repository' => 'app/Repositories', 'service' => 'app/Services', 'transformer' => 'app/Transformers', 'controller' => 'app/Http/Controllers', 'request' => 'app/Http/Requests', ], /** * Options de génération * * Choisissez quelles classes générer * * Les options suivantes peuvent être définies à true ou false */ 'generations' => [ 'model' => true, 'controller' => true, 'repository' => true, 'transformer' => true, 'service' => true, 'request' => true, ], /** * Templates personnalisés * * L'option suivante vous permet de définir des paths vers vos stubs personnalisés */ 'custom_stubs' => [ 'repository' => 'resources/stubs/repository-pattern/repository.stub', 'service' => 'resources/stubs/repository-pattern/service.stub', 'controller' => 'resources/stubs/repository-pattern/controller.stub', 'transformer' => 'resources/stubs/repository-pattern/transformer.stub', 'request' => 'resources/stubs/repository-pattern/request.stub', ], /** * Preffixes des classes */ 'preffixes' => [ 'repository' => '', 'service' => '', 'controller' => '', 'transformer' => '', 'request' => [ 'store' => 'Store', 'update' => 'Update' ], ], /** * Suffixes des classes */ 'suffixes' => [ 'repository' => 'Repository', 'service' => 'Service', 'controller' => 'Controller', 'transformer' => 'Transformer', 'request' => 'Request', ], ];
Publier les stubs (optionnel)
php artisan vendor:publish --tag=repository-pattern-stubs
Les stubs seront publiés dans resources/stubs/repository-pattern/ et vous pourrez les personnaliser selon vos besoins.
Publier les helpers (optionnel)
php artisan vendor:publish --tag=repository-pattern-helpers
Les helpers seront publiés dans app/Helpers/ et vous pourrez les personnaliser selon vos besoins.
📝 Exemple d'utilisation
Après avoir généré les composants pour Post :
1. Repository
// app/Repositories/PostRepository.php class PostRepository extends BaseRepository { public function model(): string { return Post::class; } public function getPublishedPosts() { return $this->model->where('status', 'published')->get(); } }
2. Service
// app/Services/PostService.php class PostService { public function __construct( private PostRepository $postRepository ) {} public function createPost(array $data): Post { return $this->postRepository->create($data); } }
3. Controller
// app/Http/Controllers/PostController.php class PostController extends Controller { public function __construct( private PostService $postService, private PostTransformer $postTransformer ) {} public function store(StorePostRequest $request) { $post = $this->postService->createPost($request->validated()); return response()->json([ 'data' => $this->postTransformer->transform($post) ], 201); } }
🎨 Personnalisation des stubs
Une fois les stubs publiés, vous pouvez personnaliser les templates dans resources/stubs/repository-pattern/ :
repository.stub- Template du repositoryservice.stub- Template du servicecontroller.stub- Template du contrôleurtransformer.stub- Template du transformerrequest.stub- Template des requests
Variables disponibles dans les stubs
{{ModelName}}- Nom du modèle (ex: Post){{ModelNameLowercase}}- Nom du modèle en camelCase (ex: post){{ModelNamePlural}}- Nom du modèle au pluriel (ex: posts){{ModelNameKebab}}- Nom du modèle en kebab-case (ex: post-category){{ModelNameSnake}}- Nom du modèle en snake_case (ex: post_category){{RepositoryNamespace}}- Namespace des repositories{{ServiceNamespace}}- Namespace des services{{TransformerNamespace}}- Namespace des transformers
🤝 Contribution
Les contributions sont les bienvenues ! Pour contribuer :
- Fork le projet
- Créez une branche pour votre fonctionnalité (
git checkout -b feature/nouvelle-fonctionnalite) - Committez vos changements (
git commit -am 'Ajout d'une nouvelle fonctionnalité') - Poussez vers la branche (
git push origin feature/nouvelle-fonctionnalite) - Ouvrez une Pull Request
📋 Roadmap
- Support des migrations automatiques
- Génération des tests automatiques
- Support des relations Eloquent
- Templates pour API Resources
- Support des Factory et Seeders
🐛 Signaler un bug
Si vous trouvez un bug, veuillez ouvrir une issue sur GitHub avec :
- La version de Laravel utilisée
- La version du package
- Les étapes pour reproduire le bug
- Le message d'erreur complet
📄 Licence
Ce package est open source sous licence MIT.
🏷️ Changelog
v1.0.0 - Release initiale
- ✅ Génération complète du pattern Repository
- ✅ Support Laravel 9.x, 10.x, 11.x
- ✅ Stubs personnalisables
- ✅ Configuration flexible
- ✅ Documentation complète
Développé avec ❤️ par Jean-louis Dikasa