Artesaos\Warehouse e Repository Patterns — Parte 2

Fala pessoal, estamos de volta para falarmos sobre Repository Pattern e o Artesãos\Warehouse. Para você que não leu a primeira parte é só clicar aqui. Sem mais delongas, vamos para a parte boa.

Um pouco mais sobre Repository Pattern

Esse padrão pode ser usado com diversos objetivos. Vamos nos focar apenas em dois:

  • Regras de negócio centralizada.
  • Facilidade de manutenção do código

A implementação do Warehouse será focada nesses dois objetivos.

Instalando

Primeiro passo para instalar o Warehouse em nossa aplicação Laravel é usando o já famoso composer require:

composer require artesaos/warehouse 2.x-dev

Com o pacote já instalado, já temos tudo que precisamos para começar. Como o Warehouse v2 foi desenvolvido para ser um boilerplate para Repository Patterns, ele implementa o básico sem nenhuma regra de negocio definida.

Implementando

Em primeiro lugar vamos criar duas classe, o nosso repositório e o contrato para ele.

UsersRepository (Respositório)

<?php

namespace App\Domains\Users\Repositories;
use App\Domains\Users\Contracts\UsersRepository as UsersRepositoryContract;
use App\Domains\Users\User;
use Artesaos\Warehouse\AbstractCrudRepository;

class UsersRepository extends AbstractCrudRepository implements UsersRepositoryContract
{

/**
* @var User
*/
protected $modelClass = User::class;

}

UsersRepository (Contrato)

<?php

namespace App\Domains\Users\Contracts;

use Artesaos\Warehouse\Contracts\BaseRepository;
use Artesaos\Warehouse\Contracts\Segregated\CrudRepository;

interface UsersRepository extends CrudRepository, BaseRepository
{
//
}

Antes de criamos o UsersController, temos que registrar o bind do nosso contrato em nosso AppServiceProvider:

use App\Domains\Users\Contracts\UsersRepository as UsersRepositoryContract;
use App\Domains\Users\Repositories\UsersRepository;
--------------------------------------------------------------------
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton(UsersRepositoryContract::class, UsersRepository::class);
}

UsersController

Para criar o nosso controller vamos usar o nosso amigo Artisan:

php artisan make:controller UsersController --plain

O controller gerado será igual o código abaixo:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class UsersController extends Controller
{
//
}

Com o nosso controller criado, estamos pronto para usar a implementação do Warehouse através do contrato UsersRepository:

Importando o nosso contrato:

use App\Domains\Users\Contracts\UsersRepository;

Instanciando nosso repositório:

/**
* @var UsersRepository
*/
private $repository;
/**
* UsersController constructor.
* @param UsersRepository $repository
*/
public function __construct(UsersRepository $repository)
{
$this->repository = $repository;
}

Agora através da nossa propriedade $repository podemos usar os três únicos métodos públicos em nosso controller que o Warehouse nos trás. Abaixo podemos ver como usar cada um desses métodos:

/**
* Método findById()
*/
public function usuario($id)
{
return $this->repository->findByID($id);
}
------------------------------------------------------------
/**
* Método getAll()
*/
public function listarTodos()
{
return $this->repository->getAll(false, false);
}
------------------------------------------------------------
/**
* Método lists()
*/
public function selectDeUsuarios()
{
return $this->repository->lists('name', 'id');
}

Para finalizarmos, criamos nossas rotas:

Route::get('usuario/{id}', [
'uses' => 'UsersController@usuario'
]);
Route::get('listar', [
'uses' => 'UsersController@listarTodos'
]);

Route::get('select', [
'uses' => 'UsersController@selectDeUsuarios'
]);

Acessando as rotas criadas, teremos os seguintes resultados:

/**
* Método usuario
* É passado um id como argumento e retorna apenas um registro
*/
{
id:10,
name: "Ila Leuschke",
email: "Arch.Sipes@yahoo.com",
created_at: "2016-03-06 15:57:14",
updated_at: "2016-03-06 15:57:14"
}
------------------------------------------------------------------
/**
* Método listar
* É retornado todos os registros que existem no banco de dados
*/
[
{
id: 6,
name: "Hilma Hackett",
email: "vHoppe@yahoo.com",
created_at: "2016-03-06 15:57:14",
updated_at: "2016-03-06 15:57:14"
}
. . .
    {
id: n,
name: "Maribel Altenwerth",
email: "oKlocko@yahoo.com",
created_at: "2016-03-06 15:57:14",
updated_at: "2016-03-06 15:57:14"
}
]
------------------------------------------------------------------
/**
* Método selectDeUsuarios
* É todos os registros, porém formatados para serem utilizados
* para popular um elemento do html, o nosso famoso SELECT
*/
{
6: "Hilma Hackett",
7: "Murl Heathcote",
8: "Maribel Altenwerth",
9: "Louisa Johns",
...
29: "Keyshawn Sipes",
30: "Fredrick O'Keefe"
}

Até a parte 3 caros amigos.

Like what you read? Give Gilvan Júnior a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.