prettus/l5-repository
Repository pattern implementation for Laravel that abstracts the data layer with base repositories, criteria/query filters, presenters/transformers, caching, validators, and Artisan generators. Helps keep controllers thin and makes apps easier to maintain and test.
make:entity, make:repository) reduce boilerplate, accelerating development.with()).CacheableInterface) may lead to stale data if not handled properly.BaseRepository) could complicate future migrations away from the package.User, Order) for initial adoption.all(), find(), create()) before adding Criteria/Presenters.make:entity) to reduce manual setup.// Before
$users = User::where('active', 1)->paginate(10);
// After
$users = $this->userRepository->paginate(10)->pushCriteria(new ActiveUsersCriteria());
SearchCriteria, RoleCriteria).$this->repository->pushCriteria(new SearchCriteria($request->query));
UserPresenter).$this->userRepository->setPresenter(new UserPresenter());
| Phase | Tasks | Dependencies |
|---|---|---|
| Setup | Install package, publish config, configure generators. | Laravel 8+ |
| Basic Repositories | Migrate 3–5 core models to repositories. | Eloquent models |
| Criteria | Implement 2–3 common Criteria (e.g., search, role-based). | Basic repositories |
| Presenters | Standardize API responses with Presenters. | Criteria in place |
| Validation | Integrate Validators for model-level rules. | Presenters/Criteria |
| Testing | Write repository-level unit tests. | All prior phases |
| Optimization | Profile and optimize queries (e.g., with(), caching). |
Full integration |
*Repository, *Criteria).tags, events).Redis).with() eager loading can cause N+1 issues.
with() sparingly; prefer Criteria.CacheableInterface) reduce database load.| Risk | Impact | Mitigation Strategy |
|---|---|---|
| Query performance degradation | Slow API responses. | Profile with Laravel Debugbar; optimize Criteria. |
| Cache stampede | High DB load during cache misses. | Use probabilistic early expiration. |
| Criteria misconfiguration | Incorrect filtering. | Unit test all Criteria; use dd($query) for debugging. |
| Presenter data leaks | Sensitive fields exposed. | Enforce field-level visibility rules. |
| Package abandonment | No updates for Laravel 14+. | Fork or migrate to Spatie’s Repository alternative. |
| Migration failures | Breaking changes in upgrades. | Test upgrades in staging; use `composer |
How can I help you explore Laravel packages today?