Wallogit.com
2017 © Pedro Peláez
laravel eloquent abstract repository to implement repository pattern in easy way
using repository pattern in laravel with a great base repository, (*1)
Methods, (*2)
Usage, (*3)
Execute the following command to get the latest version of the package:, (*4)
composer require ra3oul/eloquent-abstract-repository -dev
In your config/app.php add
ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class to the end of the providers array:, (*5)
'providers' => [
...
ra3oul\EloquentAbstractRepository\EloquentAbstractRepositoryServiceProvider::class,
],
Create your model normally, but it is important to define the attributes that can be filled from the input form data., (*6)
namespace App;
class Article extends Eloquent { // can be any other class name
protected $fillable = [
'name',
'author',
...
];
...
}
namespace App;
use Foo ;
use ra3oul\EloquentAbstractRepository\repository\RepositoryInterface;
interface ArticleRepositoryInterface extends RepositoryInterface
{
}
namespace App;
use Foo ;
class ArticleRepository extends AbstractEloquentRepository implements ArticleRepositoryInterface
public function __construct(Foo $model)
{
parent::__construct($model);
}
}
in order to bind interfaces to repository classes we should create a simple service provider to bind them, (*7)
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider
{
protected function registeredRepositories()
{
// 'Repository Interface' => 'Implementation'
return [
'\App\ArticleRepositoryInterface' =>
'\App\ArticleRepository',
// you should add other interfaces and their implemented classes below !
];
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$repos = $this->registeredRepositories();
foreach ($repos as $interface => $implemented) {
$this->app->bind($interface, $implemented);
}
}
namespace App\Http\Controllers;
use App\ArticleRepositoryInterface;
class ArticlesController extends BaseController {
/**
* @var ArticleRepository
*/
protected $repository;
public function __construct(FooRepositoryInterface $repository){
$this->repository = $repository;
}
....
}
Find all results in Repository, (*8)
$articles = $this->repository->findAll();
Find all results in Repository with pagination, (*9)
$aritcles = $this->repository->columns([*])->paginate($limit=10);
Find by result by id, (*10)
$articles = $this->repository->findOneById($id);
Showing only specific attributes of the model, (*11)
$article = $this->repository->columns(['id', 'state_id'])->findOneById($id);
Loading the Model relationships, (*12)
$article = $this->repository->with(['state'])->findOneById($id);
Find by result by field name, (*13)
$articles = $this->repository->findOneBy('country_id','15');
Find by result by field, (*14)
$articles = $this->repository->findManyBy('name','rasoul');
Find by result by multiple values in id, (*15)
$articles = $this->repository->findManyByIds([1,2,3,4,5]);
Create new entry in Repository, (*16)
$article = $this->repository->create( Input::all() );
Update entry in Repository, (*17)
$article = $this->repository->updateOneById( $id , Input::all());
Delete entry in Repository, (*18)
$this->repository->deleteOneById($id)