Repository pattern in Laravel 5.2
An implementation of this awesome Blog article by Bosnadev., (*1)
Based on Bosnadev/Repositories with some minor changes, mostly PSR-2 compliance., (*2)
You should, by all means, read the article and work it out for yourself, as the Repository Pattern
is a very important concept to properly implement a data access layer for any medium/large scale application., (*3)
NOTE
As stated above, this package is a personal implementation of Bosniadev's for my projects and testings., (*4)
Thus, for the time being, you most definitely should use that package instead of this one,
and follow it's instructions., (*5)
INSTALL
bash
composer require "samkitano/repository"
, (*6)
Usage
<?php namespace App\Repositories;
use Kitano\Repository\Contracts\RepositoryInterface;
use Kitano\Repository\Eloquent\Repository;
class UseRepository extends Repository {
public function model() {
return 'App\User';
}
}
<?php namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
protected $primaryKey = 'user_id';
protected $table = 'users';
protected $casts = [
"verified" => 'boolean'
];
}
<?php
namespace App\Http\Controllers;
use App\Repositories\UsersRepository as User;
class UsersController extends Controller {
protected $user;
public function __construct(User $user) {
$this->user = $user;
}
public function index() {
return response()->json($this->user->all());
}
}
Available Methods
The following methods are available:, (*7)
Kitano\Repository\Contracts\RepositoryInterface
public function all($columns = array('*'))
public function lists($value, $key = null)
public function paginate($perPage = 1, $columns = array('*'));
public function create(array $data)
public function update(array $data, $id, $attribute = "id")
public function delete($id)
public function find($id, $columns = array('*'))
public function findBy($field, $value, $columns = array('*'))
public function findAllBy($field, $value, $columns = array('*'))
public function findWhere($where, $columns = array('*'))
Kitano\Repository\Contracts\CriteriaInterface
public function apply($model, Repository $repository)
Example usage
Create a new user in repository:, (*8)
$this->user->create($input);
Update existing user:, (*9)
$this->user->update($input, $user_id);
Delete user:, (*10)
$this->user->delete($id);
Find user by user_id;, (*11)
$this->user->find($id);
you can also chose what columns to fetch:, (*12)
$this->user->find($id, ['name', 'email', 'created_at']);
Get a single row by a single column criteria., (*13)
$this->user->findBy('email', $email);
Or you can get all rows by a single column criteria., (*14)
$this->user->findAllBy('active', true);
Get all results by multiple fields, (*15)
$this->user->findWhere([
'active' => true,
['created_at', '>', Carbon::yesterday()]
]);
Criteria
<?php
namespace App\Repositories\Criteria\Users;
use Carbon\Carbon;
use Kitano\Repository\Criteria\Criteria;
use Kitano\Repository\Contracts\RepositoryInterface as Repository;
class RegisteredToday extends Criteria {
/**
* @param $model
* @param RepositoryInterface $repository
* @return mixed
*/
public function apply($model, Repository $repository)
{
$yesterday = Carbon::yesterday();
$model = $model->where('created_at', '>', $yesterday);
return $model;
}
}
<?php
namespace App\Http\Controllers;
use App\Repositories\Criteria\Users\RegisteredToday;
use App\Repositories\UsersRepository as User;
class UsersController extends Controller {
/**
* @var User
*/
protected $user;
public function __construct(User $user) {
$this->user = $user;
}
public function index() {
$this->user->addCriteria(new RegisteredToday());
return response()->json($this->user->all());
}
}
Credits
Bosnadev/Repositories, (*16)
This great package by @andersao. Here is another package I used as reference., (*17)
This article by Shawn McCool, (*18)
This Jeffrey Way's lesson from Laracasts, (*19)
License
MIT license, (*20)