cuongnx / laravel-repo-service-generator
Generate repository-service structure for Laravel with interface and binding
Installs: 60
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/cuongnx/laravel-repo-service-generator
Requires
- php: >=8.1
- illuminate/support: ^11.0 || ^12.0
README
โ Generate clean Repository-Service structure with interfaces, bindings, and optional MongoDB support for Laravel 11 and 12+
This library provides a powerful artisan command set to generate and manage Repository-Service architecture with optional binding, base classes, and multi-model support. It helps you follow a clean, testable architecture in Laravel projects.
๐งพ Version Information
| Library Version | v1.0.0 |
|---|---|
| Laravel | ^11.0, ^12.0 |
| PHP Version | >= 8.1 |
| MongoDB Support | Optional (--type=m) via mongodb/laravel-mongodb |
๐ Table of Contents
- Features
- Installation
- Full Structure Generation
- Create Simple Service
- Bindings
- Unbind
- Remove Structures
- BaseRepository Methods
- BaseService Methods
- Advanced Query Conditions
- Folder Structure
โ๏ธ โ Features
- Generate Repository, Service, Interface automatically.
- Optional Model generation (Eloquent or MongoDB).
- Auto-bind/unbind to
AppServiceProvider. - Middleware-safe service usage.
- Reversible file generation (remove struct).
- Extendable base classes.
- Fast CLI operations.
โ๏ธ Installation
composer require cuongnx/laravel-repo-service-generator
๐ฆ For MongoDB support:
composer require mongodb/laravel-mongodb
๐งฑ Create Full Structure (Model + Repo + Service)
php artisan cuongnx:make-struct Post
Options:
| Flag | Description |
|---|---|
--model, --m |
Also generate the model class |
--type= |
Model type: d = Eloquent (default), m = MongoDB |
--no-bind |
Skip automatic binding in AppServiceProvider |
--f, --force |
Overwrite existing files |
๐ Example with MongoDB:
php artisan cuongnx:make-struct Product --m --type=m
This command will generate the following files and structure:
app/
โโโ Models/
โ โโโ Post.php
โโโ Repositories/
โ โโโ Contracts/
โ โ โโโ PostRepositoryInterface.php
โ โโโ PostRepository.php
โโโ Services/
โโโ Contracts/
โ โโโ PostServiceInterface.php
โโโ PostService.php
File Descriptions:
-
app/Models/Post.php
โ The Eloquent or MongoDB model class forPost. -
app/Repositories/Contracts/PostRepositoryInterface.php
โ Interface defining methods specific to thePostrepository. -
app/Repositories/PostRepository.php
โ Repository class implementing data access logic forPost.
ExtendsBaseRepositoryand implementsPostRepositoryInterface. -
app/Services/Contracts/PostServiceInterface.php
โ Interface defining service-level business methods forPost. -
app/Services/PostService.php
โ Service class implementing business logic related toPost.
ExtendsBaseServiceand implementsPostServiceInterface.
๐ If --no-bind is not provided, the following bindings will be added to AppServiceProvider:
$this->app->bind( \App\Repositories\Contracts\PostRepositoryInterface::class, \App\Repositories\PostRepository::class ); $this->app->bind( \App\Services\Contracts\PostServiceInterface::class, \App\Services\PostService::class );
๐งฑ Create Simple Service & Interface (Without implement BaseService)
php artisan cuongnx:make-service Custom
Options:
| Flag | Description |
|---|---|
--no-bind |
Skip automatic binding in AppServiceProvider |
--f, --force |
Overwrite existing files |
This command will generate the following files and structure:
app/
โโโ Services/
โโโ Contracts/
โ โโโ CustomServiceInterface.php
โโโ CustomService.php
File Descriptions:
-
app/Services/Contracts/CustomServiceInterface.php
โ Defines custom methods for yourCustomservice logic. -
app/Services/CustomService.php
โ Contains business logic related toCustom, implementsCustomServiceInterface.
๐ Bindings
Bind both repository & service:php artisan cuongnx:bind-model User
Options:
| Flag | Description |
|---|---|
--only=repo |
Bind only repository |
--only=service |
Bind only service |
Bind individually:
php artisan cuongnx:bind-repo User php artisan cuongnx:bind-service User
โ Unbind Bindings
```bash php artisan cuongnx:unbind-model User ```Options:
| Flag | Description |
|---|---|
--only=repo |
Unbind only repository |
--only=service |
Unbind only service |
Or directly:
php artisan cuongnx:unbind-repo User
php artisan cuongnx:unbind-service User
๐งน Remove Structures
Remove all (repo + service + optional model):php artisan cuongnx:remove-struct Post --model
Options:
| Flag | Description |
|---|---|
--model, -m |
Also remove model |
--no-unbind |
Do not unbind from AppServiceProvider |
Remove only service:
php artisan cuongnx:remove-service Post
๐๏ธ BaseRepository Methods
All repositories extend BaseRepository and automatically gain access to these common data methods.
๐ Read Methods
| Method | Description |
|---|---|
getAll(array $relations = [], array|string|null $orderBy = null) |
Get all records with optional relationships and ordering |
get(?array $fields = null, array $relations = [], array|string|null $orderBy = null) |
Get all records with selected fields, relationships, and ordering |
find($id, ?array $fields = null, array $relations = []) |
Find by ID with optional field selection and relationships |
findBy(string $key, $value, ?array $fields = null, array $relations = [], array|string|null $orderBy = null) |
Find a single record by key-value |
findByAttributes(array $conditions, ?array $fields = null, array $relations = [], array|string|null $orderBy = null) |
Find a single record by multiple attributes |
getBy(string $key, $value, ?array $fields = null, array $relations = [], array|string|null $orderBy = null) |
Get multiple records by key-value |
getByAttributes(array $conditions, ?array $fields = null, array $relations = [], array|string|null $orderBy = null) |
Get multiple records by attributes |
withTrashed(array $conditions = [], ?array $fields = null, array $relations = []) |
Get including soft-deleted records |
onlyTrashed(array $conditions = [], ?array $fields = null, array $relations = []) |
Get only soft-deleted records |
๐ Pagination
| Method | Description |
|---|---|
paginate(int $perPage = 15, array $conditions = [], ?array $fields = null, array $relations = []) |
Laravel paginated list with filters and relationships |
paginateCustom(array $conditions = [], ?array $fields = null, array $relations = [], array|string|null $orderBy = null, int $page = 1, int $limit = 10) |
Custom pagination returning array with data, current_page, per_page, total, last_page |
๐ Aggregate Methods
| Method | Description |
|---|---|
countBy(array $conditions = []): int |
Count records by conditions |
sum(string $column, array $conditions = []): float|int |
Sum a column value with optional conditions |
avg(string $column, array $conditions = []): ?float |
Average of a column value |
max(string $column, array $conditions = []): float|int|null |
Maximum value of a column |
min(string $column, array $conditions = []): float|int|null |
Minimum value of a column |
๐ง Utility Methods
| Method | Description |
|---|---|
pluck(string $column, ?string $key = null, array $conditions = []) |
Pluck values from a column |
chunk(int $count, callable $callback, array $conditions = []): bool |
Process records in chunks |
increment(string $column, int $amount = 1, array $conditions = [], array $extra = []): int |
Increment column value |
decrement(string $column, int $amount = 1, array $conditions = [], array $extra = []): int |
Decrement column value |
โ Existence Checks
| Method | Description |
|---|---|
existsBy(string $field, $value): bool |
Check if a value exists for a field |
existsByAttributes(array $conditions): bool |
Check existence by multiple attributes |
๐ Create/Update Methods
| Method | Description |
|---|---|
create(array $data) |
Create a new record |
update($id, array $data) |
Update by ID |
updateFields($model, array $fields, array $except = []) |
Update specific fields on a model instance |
firstOrCreate(array $attributes, array $values = [], array $relations = []) |
Find or create a record, returns [Model, bool $wasCreated] |
firstOrNew(array $attributes, array $values = [], array $relations = []) |
Find or instantiate (without saving), returns [Model, bool $isNew] |
createOrUpdate(array $attributes, array $values = [], ?array $checkFields = null) |
Create or update with field tracking, returns [Model, bool $wasCreated, bool $wasUpdated, array $changedFields] |
updateOrCreate(array $attributes, array $values = [], array $relations = []) |
Find and update or create, returns [Model, bool $wasCreated] |
โ Delete / Restore Methods
| Method | Description |
|---|---|
delete($id) |
Soft delete by ID |
deleteBy(array $conditions): int |
Delete by conditions, returns number of deleted records |
restore($id): bool |
Restore soft-deleted record |
forceDelete($id): bool |
Permanently delete record |
๐ง BaseService Methods
All services extend BaseService and delegate to the repository methods. The service layer is where you implement business logic on top of the repository.
Services have access to all BaseRepository methods through their repository instance. You can add custom business logic methods in your service classes.
๐ Advanced Query Conditions
The BaseRepository supports flexible query conditions for both Eloquent and MongoDB.
1๏ธโฃ Simple Conditions
$conditions = [ 'status' => 'active', 'user_id' => 123 ]; $posts = $postRepo->getByAttributes($conditions);
2๏ธโฃ Comparison Operators
$conditions = [ 'price' => ['>=', 100], 'stock' => ['<', 50], 'rating' => ['>', 4.5] ]; $products = $productRepo->getByAttributes($conditions);
3๏ธโฃ MongoDB Operators
// Using MongoDB $gte, $lte operators $conditions = [ 'expired_at' => [ '$gte' => now(), '$lte' => now()->addDays(30) ] ]; // Using MongoDB $elemMatch for array fields $conditions = [ 'tags' => [ '$elemMatch' => ['name' => 'Laravel', 'type' => 'framework'] ] ];
4๏ธโฃ Date Range Queries
// Using from/to syntax $conditions = [ 'created_at' => [ 'from' => now()->subDays(7), 'to' => now() ] ]; // Using min/max syntax $conditions = [ 'price' => [ 'min' => 100, 'max' => 1000 ] ]; // Using between operator $conditions = [ 'age' => ['between', [18, 65]] ];
5๏ธโฃ IN / NOT IN Queries
$conditions = [ 'status' => ['in', ['active', 'pending', 'processing']], 'category_id' => ['not_in', [5, 10, 15]] ];
6๏ธโฃ NULL Checks
$conditions = [ 'deleted_at' => ['null'], 'email_verified_at' => ['not_null'] ];
7๏ธโฃ Combined Complex Queries
$conditions = [ 'status' => 'active', 'price' => [ '$gte' => 100, '$lte' => 1000 ], 'category_id' => ['in', [1, 2, 3]], 'created_at' => [ 'from' => now()->subMonth(), 'to' => now() ], 'tags' => [ '$elemMatch' => ['featured' => true] ] ]; $products = $productRepo->getByAttributes( conditions: $conditions, fields: ['id', 'name', 'price'], relations: ['category', 'images'], orderBy: ['created_at' => 'desc'] );
8๏ธโฃ Ordering Results
// Simple ordering (string) $orderBy = 'created_at'; // defaults to 'asc' // Single field ordering (array) $orderBy = ['created_at' => 'desc']; // Multiple field ordering $orderBy = [ 'status' => 'asc', 'created_at' => 'desc' ]; // Alternative syntax with indexed arrays $orderBy = [ ['status', 'asc'], ['created_at', 'desc'] ];
Real-World Examples
Get Active Products Expiring Soon
$products = $productRepo->getByAttributes([ 'status' => 'active', 'expired_at' => [ '$gte' => now(), '$lte' => now()->addDays(30) ] ], orderBy: ['expired_at' => 'asc']);
Get Orders from Last Month in Price Range
$orders = $orderRepo->getByAttributes([ 'total_amount' => [ 'min' => 1000, 'max' => 5000 ], 'created_at' => [ 'from' => now()->subMonth()->startOfMonth(), 'to' => now()->subMonth()->endOfMonth() ], 'status' => ['in', ['completed', 'shipped']] ], relations: ['user', 'items']);
MongoDB Array Query with Tags
$posts = $postRepo->getByAttributes([ 'published' => true, 'tags' => [ '$elemMatch' => [ 'name' => 'Laravel', 'type' => 'framework' ] ], 'views' => ['>=', 1000] ], orderBy: ['views' => 'desc']);
๐ Folder Structure
app/
โโโ Repositories/
โ โโโ Contracts/
โ โ โโโ BaseRepositoryInterface.php
โ โ โโโ UserRepositoryInterface.php
โ โ โโโ PostRepositoryInterface.php
โ โโโ BaseRepository.php
โ โโโ UserRepository.php
โ โโโ PostRepository.php
โโโ Services/
โ โโโ Contracts/
โ โ โโโ BaseServiceInterface.php
โ โ โโโ CustomServiceInterface.php
โ โ โโโ UserServiceInterface.php
โ โ โโโ PostServiceInterface.php
โ โโโ BaseService.php
โ โโโ CustomService.php
โ โโโ UserService.php
โ โโโ PostService.php
โโโ Models/
โโโ User.php
โโโ Post.php
๐ฌ Contact
- Email: xuancuong220691@gmail.com
๐ License
- MIT License ยฉ Cuong Nguyen