PHPackages                             cuongnx/laravel-repo-service-generator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. cuongnx/laravel-repo-service-generator

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

cuongnx/laravel-repo-service-generator
======================================

Generate repository-service structure for Laravel with interface and binding

v3.0.1(3w ago)1102MITPHPPHP &gt;=8.1

Since Jul 29Pushed 3w agoCompare

[ Source](https://github.com/xuancuong220691/laravel-repo-service-generator)[ Packagist](https://packagist.org/packages/cuongnx/laravel-repo-service-generator)[ RSS](/packages/cuongnx-laravel-repo-service-generator/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (4)Versions (14)Used By (0)

🧱 Laravel Repo-Service Struct Generator
=======================================

[](#-laravel-repo-service-struct-generator)

✅ 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
---------------------

[](#-version-information)

**Library Version**v1.1.0**Laravel**^11.0, ^12.0**PHP Version**&gt;= 8.1**MongoDB Support**Optional (`--type=m`) via [`mongodb/laravel-mongodb`](https://github.com/mongodb/laravel-mongodb)---

📚 Table of Contents
-------------------

[](#-table-of-contents)

- [Features](#features)
- [Installation](#installation)
- [Generate Base Classes](#generate-base-classes)
- [Full Structure Generation](#create-full-structure-model--repo--service)
- [Create Simple Service](#create-simple-service-interface)
- [Bindings](#bindings)
- [Unbind](#unbind-bindings)
- [Remove Structures](#remove-structures)
- [Subdirectory Support](#subdirectory-support)
- [BaseRepository Methods](#baserepository-methods)
- [BaseService Methods](#baseservice-methods)
- [Advanced Query Conditions](#advanced-query-conditions)
- [Folder Structure](#folder-structure)

---

⚙️ Features
-----------

[](#️-features)

- Generate Repository, Service, Interface automatically.
- Optional Model generation (Eloquent or MongoDB).
- Auto-bind/unbind to `AppServiceProvider`.
- Subdirectory/nested folder support (e.g. `Pay/Transaction`).
- Generate App-level base classes for easy extension.
- `transaction()` support via DB facade.
- Reversible file generation (remove struct).
- Fast CLI operations.

---

⚙️ Installation
---------------

[](#️-installation)

```
composer require cuongnx/laravel-repo-service-generator
```

> 📦 For MongoDB support:

```
composer require mongodb/laravel-mongodb
```

---

🏗️ Generate Base Classes
------------------------

[](#️-generate-base-classes)

```
php artisan cuongnx:make-base
```

Generates App-level base classes that **extend** the library's base classes, so you can add custom methods or override behavior without modifying the vendor code.

### Options:

[](#options)

FlagDescription`--f`, `--force`Overwrite existing files### Generated files:

[](#generated-files)

```
app/
├── Repositories/
│   ├── Contracts/
│   │   └── BaseRepositoryInterface.php   ← extends lib BaseRepositoryInterface
│   └── Eloquent/
│       └── BaseRepository.php            ← extends lib BaseRepository
└── Services/
    ├── Contracts/
    │   └── BaseServiceInterface.php      ← extends lib BaseServiceInterface
    └── BaseService.php                   ← extends lib BaseService

```

Once these files exist, all subsequently generated repositories and services will **automatically extend your App-level base** instead of the library's base. This allows you to add shared methods across your entire project.

> ⚠️ Run `cuongnx:make-base` **before** generating your first struct for best results.

---

🧱 Create Full Structure (Model + Repo + Service)
------------------------------------------------

[](#-create-full-structure-model--repo--service)

```
php artisan cuongnx:make-struct Post
```

### Options:

[](#options-1)

FlagDescription`--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 generates the following files:

```
app/
├── Models/
│   └── Post.php
├── Repositories/
│   ├── Contracts/
│   │   └── PostRepositoryInterface.php
│   └── Eloquent/
│       └── PostRepository.php
└── Services/
    ├── Contracts/
    │   └── PostServiceInterface.php
    └── PostService.php

```

📌 If `--no-bind` is not provided, the following bindings will be added to `AppServiceProvider`:

```
$this->app->bind(
    \App\Repositories\Contracts\PostRepositoryInterface::class,
    \App\Repositories\Eloquent\PostRepository::class
);

$this->app->bind(
    \App\Services\Contracts\PostServiceInterface::class,
    \App\Services\PostService::class
);
```

---

🧱 Create Simple Service &amp; Interface
---------------------------------------

[](#-create-simple-service--interface)

Creates a standalone service without a repository — useful for business logic that doesn't need direct database access.

```
php artisan cuongnx:make-service Custom
```

### Options:

[](#options-2)

FlagDescription`--no-bind`Skip automatic binding in `AppServiceProvider``--f`, `--force`Overwrite existing filesGenerated files:

```
app/
└── Services/
    ├── Contracts/
    │   └── CustomServiceInterface.php
    └── CustomService.php

```

---

🔌 Bindings
----------

[](#-bindings)

Bind both repository &amp; service:

```
php artisan cuongnx:bind-model User
```

### Options:

[](#options-3)

FlagDescription`--only=repo`Bind only repository`--only=service`Bind only serviceBind individually:

```
php artisan cuongnx:bind-repo User
php artisan cuongnx:bind-service User
```

---

❌ Unbind Bindings
-----------------

[](#-unbind-bindings)

```
php artisan cuongnx:unbind-model User
```

### Options:

[](#options-4)

FlagDescription`--only=repo`Unbind only repository`--only=service`Unbind only serviceOr directly:

```
php artisan cuongnx:unbind-repo User
php artisan cuongnx:unbind-service User
```

---

🧹 Remove Structures
-------------------

[](#-remove-structures)

Remove all generated files (repo + service + optional model):

```
php artisan cuongnx:remove-struct Post --model
```

### Options:

[](#options-5)

FlagDescription`--model`, `-m`Also remove model`--no-unbind`Do not unbind from AppServiceProviderRemove only service:

```
php artisan cuongnx:remove-service Post
```

---

📂 Subdirectory Support
----------------------

[](#-subdirectory-support)

All commands support nested folder structure using `/` as separator. This is useful for grouping related models under a domain or module.

```
php artisan cuongnx:make-struct Pay/Transaction --m
php artisan cuongnx:make-service Pay/Notification
php artisan cuongnx:bind-model Pay/Transaction
php artisan cuongnx:unbind-model Pay/Transaction
php artisan cuongnx:remove-struct Pay/Transaction
```

For `Pay/Transaction`, the generated structure is:

```
app/
├── Models/
│   └── Pay/
│       └── Transaction.php
├── Repositories/
│   ├── Contracts/
│   │   └── Pay/
│   │       └── TransactionRepositoryInterface.php
│   └── Eloquent/
│       └── Pay/
│           └── TransactionRepository.php
└── Services/
    ├── Contracts/
    │   └── Pay/
    │       └── TransactionServiceInterface.php
    └── Pay/
        └── TransactionService.php

```

Bindings use the full namespaced class:

```
$this->app->bind(
    \App\Repositories\Contracts\Pay\TransactionRepositoryInterface::class,
    \App\Repositories\Eloquent\Pay\TransactionRepository::class
);
```

> Supports any depth: `Pay/Gateway/Transaction`, `Admin/Report/Monthly`, etc.

---

🗄️ BaseRepository Methods
-------------------------

[](#️-baserepository-methods)

All repositories extend `BaseRepository` and automatically gain access to these common data methods.

### 🔍 Read Methods

[](#-read-methods)

MethodDescription`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 records with selected fields, relationships, and ordering`find($id, ?array $fields = null, array $relations = [], array|string|null $orderBy = null)`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 (model must use `SoftDeletes`)`onlyTrashed(array $conditions = [], ?array $fields = null, array $relations = [])`Get only soft-deleted records (model must use `SoftDeletes`)### 📊 Pagination

[](#-pagination)

MethodDescription`paginate(int $perPage = 15, array $conditions = [], ?array $fields = null, array $relations = [], array|string|null $orderBy = null)`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): array`Custom pagination returning `['data', 'current_page', 'per_page', 'total', 'last_page']`### 📈 Aggregate Methods

[](#-aggregate-methods)

MethodDescription`countBy(array $conditions = []): int`Count records by conditions`sum(string $column, array $conditions = []): float|int`Sum a column`avg(string $column, array $conditions = []): ?float`Average of a column`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

[](#-utility-methods)

MethodDescription`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; callback returning `false` stops iteration`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`transaction(callable $callback): mixed`Run a callable inside a database transaction### ✅ Existence Checks

[](#-existence-checks)

MethodDescription`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

[](#-createupdate-methods)

MethodDescription`create(array $data)`Create a new record`update($id, array $data)`Update by ID`updateFields($model, array $fields, array $except = [])`Update specific fillable fields on a model instance`firstOrCreate(array $attributes, array $values = [], array $relations = [])`Find or create; 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): array`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

[](#-delete--restore-methods)

MethodDescription`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
---------------------

[](#-baseservice-methods)

All services extend `BaseService` and delegate every method to the underlying repository. The service layer is where you implement business logic on top of the repository.

`BaseService` exposes the same interface as `BaseRepository` — all read, write, aggregate, pagination, and utility methods are available. Additional service-level methods:

MethodDescription`transaction(callable $callback): mixed`Run a callable inside a database transaction (delegates to repository)To add custom business logic, define methods in your generated service class:

```
class PostService extends BaseService implements PostServiceInterface
{
    public function publish(int $id): bool
    {
        return $this->transaction(function () use ($id) {
            return $this->update($id, ['status' => 'published', 'published_at' => now()]);
        });
    }
}
```

---

🔍 Advanced Query Conditions
---------------------------

[](#-advanced-query-conditions)

The `BaseRepository` supports flexible query conditions for both Eloquent and MongoDB.

### 1️⃣ Simple Conditions

[](#1️⃣-simple-conditions)

```
$conditions = [
    'status' => 'active',
    'user_id' => 123
];

$posts = $postRepo->getByAttributes($conditions);
```

### 2️⃣ Comparison Operators

[](#2️⃣-comparison-operators)

```
$conditions = [
    'price' => ['>=', 100],
    'stock' => ['', 4.5]
];

$products = $productRepo->getByAttributes($conditions);
```

### 3️⃣ MongoDB Operators

[](#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️⃣ Range Queries

[](#4️⃣-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]]
];
```

> Both `from/to` and `min/max` use `whereBetween()` internally.

### 5️⃣ IN / NOT IN Queries

[](#5️⃣-in--not-in-queries)

```
$conditions = [
    'status' => ['in', ['active', 'pending', 'processing']],
    'category_id' => ['not_in', [5, 10, 15]]
];
```

### 6️⃣ NULL Checks

[](#6️⃣-null-checks)

```
$conditions = [
    'deleted_at' => ['null'],
    'email_verified_at' => ['not_null']
];
```

### 7️⃣ OR Groups

[](#7️⃣-or-groups)

Use the `'or'` key to group conditions with OR logic:

```
$conditions = [
    'status' => 'active',
    'or' => [
        ['role' => 'admin'],
        ['role' => 'moderator', 'verified' => true],
    ]
];
// WHERE status = 'active' AND (role = 'admin' OR (role = 'moderator' AND verified = 1))
```

### 8️⃣ Combined Complex Queries

[](#8️⃣-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']
);
```

### 9️⃣ Ordering Results

[](#9️⃣-ordering-results)

```
// Simple string (defaults to asc)
$orderBy = 'created_at';

// Single indexed field (defaults to asc)
$orderBy = ['created_at'];

// Associative array
$orderBy = ['created_at' => 'desc'];

// Multiple fields
$orderBy = [
    'status' => 'asc',
    'created_at' => 'desc'
];

// Indexed array of tuples
$orderBy = [
    ['status', 'asc'],
    ['created_at', 'desc']
];
```

### Real-World Examples

[](#real-world-examples)

#### Get Active Products Expiring Soon

[](#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

[](#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']);
```

#### Process Large Dataset in Chunks

[](#process-large-dataset-in-chunks)

```
$stopped = $userRepo->chunk(200, function ($users) {
    foreach ($users as $user) {
        if ($user->shouldStop()) {
            return false; // stops chunking, chunk() returns false
        }
        // process...
    }
});
```

#### Run Operations in a Transaction

[](#run-operations-in-a-transaction)

```
$result = $orderService->transaction(function () use ($data) {
    $order = $this->create($data['order']);
    $this->getRepository()->deleteBy(['cart_id' => $data['cart_id']]);
    return $order;
});
```

---

📁 Folder Structure
------------------

[](#-folder-structure)

```
app/
├── Repositories/
│   ├── Contracts/
│   │   ├── BaseRepositoryInterface.php     ← generated by make-base
│   │   ├── UserRepositoryInterface.php
│   │   └── PostRepositoryInterface.php
│   └── Eloquent/
│       ├── BaseRepository.php              ← generated by make-base
│       ├── UserRepository.php
│       └── PostRepository.php
├── Services/
│   ├── Contracts/
│   │   ├── BaseServiceInterface.php        ← generated by make-base
│   │   ├── CustomServiceInterface.php
│   │   ├── UserServiceInterface.php
│   │   └── PostServiceInterface.php
│   ├── BaseService.php                     ← generated by make-base
│   ├── CustomService.php
│   ├── UserService.php
│   └── PostService.php
└── Models/
    ├── User.php
    └── Post.php

```

---

📬 Contact
---------

[](#-contact)

- Email:

---

📝 License
---------

[](#-license)

- MIT License © [Cuong Nguyen](mailto:xuancuong220691@gmail.com)

###  Health Score

45

—

FairBetter than 91% of packages

Maintenance95

Actively maintained with recent releases

Popularity14

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~26 days

Recently: every ~35 days

Total

13

Last Release

23d ago

Major Versions

v1.0.1 → v2.0.02025-12-04

v2.0.8 → v3.0.02026-04-24

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/12405391?v=4)[Xuân Cương](/maintainers/xuancuong220691)[@xuancuong220691](https://github.com/xuancuong220691)

---

Top Contributors

[![xuancuong220691](https://avatars.githubusercontent.com/u/12405391?v=4)](https://github.com/xuancuong220691 "xuancuong220691 (16 commits)")

### Embed Badge

![Health badge](/badges/cuongnx-laravel-repo-service-generator/health.svg)

```
[![Health](https://phpackages.com/badges/cuongnx-laravel-repo-service-generator/health.svg)](https://phpackages.com/packages/cuongnx-laravel-repo-service-generator)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[renatomarinho/laravel-page-speed

Laravel Page Speed

2.5k1.7M10](/packages/renatomarinho-laravel-page-speed)[illuminate/pagination

The Illuminate Pagination package.

12234.1M1.0k](/packages/illuminate-pagination)[illuminate/pipeline

The Illuminate Pipeline package.

9349.2M282](/packages/illuminate-pipeline)[illuminate/redis

The Illuminate Redis package.

8314.6M377](/packages/illuminate-redis)[illuminate/cookie

The Illuminate Cookie package.

244.6M137](/packages/illuminate-cookie)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
