/laravel-repository

:no_entry: DEPRECATED!!! Base class and methods for build repository pattern in Laravel

Primary LanguagePHPMIT LicenseMIT

Laravel repository

Latest Stable Version Total Downloads Latest Unstable Version License

Base class and methods for build repository pattern in Laravel and cache queries

Installation

Run:

	composer require fomvasss/laravel-repository

Publish config:

php artisan vendor:publish --provider="Fomvasss\Repository\Providers\RepositoryServiceProvider" --tag="repository-config"

All base methods repository

Usage

Make own repository

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;
    }
    //...
}

Use repository methods

<?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();
    
            //....
        }
    //....
}

Make custom method in own repository

! 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;
    }

Events repository

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());
}

Usage repository cache

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;
    }
}

Middleware for off cache

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']);

Change log

Please see CHANGELOG for more information what has changed recently.

License

The MIT License (MIT). Please see License File for more information.