jason-guru/laravel-make-repository
Laravel package adding Artisan “make:repository” scaffolding for the repository pattern. Quickly generate repository interfaces and implementations, keeping controllers slimmer and data access consistent and testable. Easy to install and customize for your app structure.
Installation:
composer require jason-guru/laravel-make-repository
Publish the package config (if needed):
php artisan vendor:publish --provider="JasonGuru\LaravelMakeRepository\MakeRepositoryServiceProvider"
First Use Case:
Generate a repository for a model (e.g., User):
php artisan make:repository User
This creates:
app/Repositories/UserRepository.php (interface)app/Repositories/Eloquent/UserRepositoryEloquent.php (implementation)--migration flag to scaffold a migration.Where to Look First:
config/make-repository.php for customization (e.g., paths, stubs).app/Repositories/Eloquent/ for generated implementations.vendor/jason-guru/laravel-make-repository/src/stubs/.Repository Generation:
php artisan make:repository Post --migration --model=Post
--model: Specify an existing model (default: same name as repository).--migration: Auto-generate a migration file.Customizing Stubs: Override default stubs by publishing them:
php artisan vendor:publish --tag=make-repository-stubs
Edit stubs in resources/stubs/ (e.g., repository.stub, eloquent.stub).
Integration with Existing Code:
AppServiceProvider:
$this->app->bind(
\App\Repositories\UserRepository::class,
\App\Repositories\Eloquent\UserRepositoryEloquent::class
);
public function __construct(UserRepository $userRepo) {
$this->userRepo = $userRepo;
}
Testing:
$this->mock(UserRepository::class)->shouldReceive('find')->andReturn($user);
Multiple Implementations:
Generate a JsonRepository or ApiRepository by extending the base command:
php artisan make:repository User --type=json
(Requires custom stubs or package extension.)
Scoped Repositories:
Use traits or interfaces to define domain-specific methods (e.g., ActiveUserRepository).
Repository Events:
Dispatch events in repository methods (e.g., UserCreated, UserUpdated).
Stub Path Issues:
make-repository.stubs path in config or republish stubs.resources/stubs/ (create if missing).Model Not Found:
--model flag matches an existing model or generate the model first:
php artisan make:model Post
Migration Conflicts:
--migration flag creates a basic migration. Review it for conflicts with existing tables.Namespace Collisions:
namespace in config/make-repository.php to avoid clashes (e.g., Repositories\Custom\).Command Errors:
Run with -v for verbose output:
php artisan make:repository User -v
Check for missing dependencies (e.g., laravel/framework version compatibility).
Stub Syntax Errors:
Validate stub files for PHP syntax or variable placeholders (e.g., {{namespace}}).
Custom Repository Types:
Extend the MakeRepositoryCommand to add new types (e.g., GraphQLRepository):
// app/Console/Commands/MakeGraphQLRepository.php
use JasonGuru\LaravelMakeRepository\MakeRepositoryCommand;
class MakeGraphQLRepository extends MakeRepositoryCommand {
protected $type = 'graphql';
// Override stub paths/methods
}
Dynamic Method Generation:
Use the addMethod helper in stubs to inject custom methods:
{% for method in methods %}
public function {{ method.name }}() {
// Logic here
}
{% endfor %}
Post-Generation Hooks:
Add logic after generation in MakeRepositoryServiceProvider:
public function boot() {
MakeRepository::creating(function ($repository) {
// Modify $repository before generation
});
}
config/make-repository.php:
'paths' => [
'repository' => 'app/Repositories/Custom/',
'eloquent' => 'app/Repositories/Eloquent/',
],
{{repositoryClass}}, {{modelClass}}). Undefined variables cause silent failures.How can I help you explore Laravel packages today?