Installation
composer require iamkesharinandan/therepository
Publish the config file (if available):
php artisan vendor:publish --provider="Keshari\Therepository\TherepositoryServiceProvider"
Basic Usage
UserRepositoryInterface):
namespace App\Repositories;
interface UserRepositoryInterface {
public function find(int $id);
public function all();
}
UserRepository):
namespace App\Repositories;
use Keshari\Therepository\BaseRepository;
use App\Models\User;
class UserRepository extends BaseRepository implements UserRepositoryInterface {
public function model() {
return User::class;
}
}
AppServiceProvider:
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
use App\Repositories\UserRepositoryInterface;
class UserController {
protected $userRepository;
public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}
public function show($id) {
return $this->userRepository->find($id);
}
}
First Use Case
$user = $this->userRepository->find(1);
$users = $this->userRepository->all();
CRUD Operations
The package likely provides basic CRUD methods (e.g., create(), update(), delete()). Extend BaseRepository to leverage these:
class UserRepository extends BaseRepository {
public function model() {
return User::class;
}
public function create(array $data) {
return $this->model->create($data);
}
}
Query Scoping Add custom scopes to the repository:
public function active() {
return $this->model->where('is_active', true);
}
Usage:
$activeUsers = $this->userRepository->active()->get();
Dependency Injection Inject repositories into services/controllers:
class UserService {
public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}
}
Event Handling
Trigger events (e.g., created, deleted) in the repository:
public function create(array $data) {
$user = $this->model->create($data);
event(new UserCreated($user));
return $user;
}
Transactions Wrap operations in transactions:
public function transferOwnership(int $userId, int $newOwnerId) {
DB::transaction(function () use ($userId, $newOwnerId) {
$user = $this->find($userId);
$user->owner_id = $newOwnerId;
$user->save();
});
}
model() method returns a valid Eloquent class.return $this->userRepository->all()->resource();
$mock = Mockery::mock(UserRepositoryInterface::class);
$mock->shouldReceive('find')->andReturn($user);
$this->app->instance(UserRepositoryInterface::class, $mock);
Missing model() Method
Forgetting to define model() in your repository will throw errors. Always implement it:
public function model() {
return User::class; // Required!
}
No Base Class Methods
The package may not include all CRUD methods by default. Extend BaseRepository and manually implement missing methods (e.g., update(), delete()).
No Built-in Pagination If pagination is needed, manually add it:
public function paginate() {
return $this->model->paginate(15);
}
Service Provider Binding
Ensure interfaces are properly bound in AppServiceProvider. Avoid hardcoding repository classes in constructors.
Naming Conflicts
Avoid naming repositories ambiguously (e.g., UserRepository vs. AdminUserRepository). Use clear, consistent naming.
$this->model is null, verify model() is correctly implemented and returns a valid Eloquent class.DB::enableQueryLog();
$users = $this->userRepository->all();
dd(DB::getQueryLog());
Custom Query Builders Override methods to add custom logic:
public function search(string $query) {
return $this->model->where('name', 'like', "%{$query}%");
}
Repository Decorators Decorate repositories to add cross-cutting concerns (e.g., logging, caching):
class LoggedUserRepository implements UserRepositoryInterface {
protected $userRepository;
public function __construct(UserRepositoryInterface $userRepository) {
$this->userRepository = $userRepository;
}
public function find(int $id) {
$user = $this->userRepository->find($id);
Log::info("User {$id} retrieved", ['user' => $user]);
return $user;
}
}
Dynamic Model Binding For polymorphic repositories, dynamically set the model:
public function model(string $modelClass) {
return app($modelClass);
}
Repository Events Listen for repository events (if supported) to trigger actions:
event(new UserDeleted($user));
How can I help you explore Laravel packages today?