Base class and methods for build repository pattern in Laravel and cache queries
Run:
composer require fomvasss/laravel-repository
Publish config:
php artisan vendor:publish --provider="Fomvasss\Repository\Providers\RepositoryServiceProvider" --tag="repository-config"
- Interface all methods see in RepositoryInterface
- Realisation interface see in BaseRepository
Extend your repository class the next BaseRepository
class
<?php
namespace App\Repositories;
use App\Models\Article;
use Fomvasss\Repository\Eloquent\BaseRepository;
class ArticleRepository extends BaseRepository
{
public function model()
{
return Article::class;
}
//...
}
<?php
namespace App\Http\Controllers;
use App\Repositories\ArticleRepository;
class ArticleController extends BaseController {
protected $repository;
public function __construct(ArticleRepository $repository) {
$this->repository = $repository;
}
public function index() {
$articles = $this->repository
->scopes(['byStatus', 1], ['sortable', ['id'=>'desc']], 'searchable')
->with('user')
->where('created_at', \Carbon\Carbon::yesterday(), '>')
->orderBy('created_at')
->get();
//....
}
public function show() {
$article = $this->repository
->scope('byStatus', 1)
->with(['user', 'categories'])
->where('created_at', \Carbon\Carbon::today(), '<')
->orderBy('created_at')
->firstOrFail();
//....
}
//....
}
! Custom method do not use repository cache!
public function myCustomMethodByType($attributes)
{
$this->applyExtras();
$models = $this->query;
if (!empty($attributes['type'])) {
$models = $this->query->where('type', $attributes['type']);
}
$this->unsetClauses();
return $models;
}
Repository entity have next events:
RepositoryEntityCreated
RepositoryEntityUpdated
RepositoryEntityDeleted
For example, you can add in your EventServiceProvider next:
protected $listen = [
\Fomvasss\Repository\Events\RepositoryEntityCreated::class => [
\App\Listeners\CreatedNewModelInRepoListener::class
]
];
And use next method in method handle (in your listener CreatedNewModeInRepoListener
):
public function handle(RepositoryEntityCreated $event)
{
dd($event->getAction());
dd($event->getModel());
dd($event->getRepository());
}
All cache methods see in Interface CacheableInterface
Example repository with cache:
<?php
namespace App\Repositories;
use App\Models\Article;
use Fomvasss\Repository\Contracts\CacheableInterface;
use Fomvasss\Repository\Eloquent\BaseRepository;
use Fomvasss\Repository\Traits\CacheableRepository;
class ArticleRepository extends BaseRepository implements CacheableInterface
{
use CacheableRepository;
protected $cacheTime = 60;
protected $cacheTimeForMethod = [
'all' => 10,
'get' => 10,
'paginate' => 10,
'find' => 1,
];
protected $cacheOnly = ['all', 'get', 'find'];
public function model()
{
return Article::class;
}
}
Example usage middleware in routes:
Add to App\Http\Kernel.php
protected $routeMiddleware = [
//...
'rpc-off' => \Fomvasss\Repository\Http\Middleware\RepositoryCacheOff::class,
];
and use in your routes:
Route::get('article', ArticleController@index)->middleware(['rpc-off']);
Please see CHANGELOG for more information what has changed recently.
The MIT License (MIT). Please see License File for more information.