O uso de repositórios (Repository) é uma abordagem comum para organizar a lógica de acesso aos dados em um aplicativo Laravel. Ele ajuda a abstrair a camada de acesso ao banco de dados do resto do código, tornando o aplicativo mais flexível e fácil de manter. O Repository atua como uma camada intermediária entre o controlador e o Eloquent ORM, permitindo que você defina consultas de banco de dados e operações CRUD em um local centralizado.
Benefícios do padrão Repository:
Exemplo de implementação do padrão Repository:
Suponha que temos um modelo User
e queremos criar um Repository para lidar com as operações CRUD relacionadas a esse modelo.
Vamos começar criando uma interface para o Repository User
. Essa interface define os métodos que o Repository deve implementar.
// app/Repositories/UserRepositoryInterface.php
namespace App\\\\Repositories;
interface UserRepositoryInterface
{
public function getAllUsers();
public function getUserById($id);
public function createUser(array $data);
public function updateUser($id, array $data);
public function deleteUser($id);
}
Agora, criaremos uma classe que implementa a interface do Repository e define a lógica para acessar o modelo User
e executar as operações CRUD.
// app/Repositories/EloquentUserRepository.php
namespace App\\\\Repositories;
use App\\\\Models\\\\User;
class EloquentUserRepository implements UserRepositoryInterface
{
public function getAllUsers()
{
return User::all();
}
public function getUserById($id)
{
return User::find($id);
}
public function createUser(array $data)
{
return User::create($data);
}
public function updateUser($id, array $data)
{
$user = User::find($id);
if ($user) {
$user->update($data);
return $user;
}
return false;
}
public function deleteUser($id)
{
$user = User::find($id);
if ($user) {
$user->delete();
return true;
}
return false;
}
}
Agora, podemos utilizar o Repository EloquentUserRepository
no controlador UserController
para realizar operações CRUD relacionadas aos usuários.
// app/Http/Controllers/UserController.php
namespace App\\\\Http\\\\Controllers;
use App\\\\Repositories\\\\UserRepositoryInterface;
use Illuminate\\\\Http\\\\Request;
class UserController extends Controller
{
protected $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function index()
{
$users = $this->userRepository->getAllUsers();
return view('users.index', ['users' => $users]);
}
public function show($id)
{
$user = $this->userRepository->getUserById($id);
if (!$user) {
return redirect()->route('users.index')->with('error', 'Usuário não encontrado.');
}
return view('users.show', ['user' => $user]);
}
// Outros métodos do Controller utilizando o UserRepository
}
Registrando o Repository no Service Provider:
Para que o Laravel saiba qual implementação do Repository deve ser usada, você precisa registrar o binding no Service Provider.
// app/Providers/AppServiceProvider.php
use App\\\\Repositories\\\\EloquentUserRepository;
use App\\\\Repositories\\\\UserRepositoryInterface;
public function register()
{
$this->app->bind(UserRepositoryInterface::class, EloquentUserRepository::class);
}
Dessa forma, o Laravel irá injetar automaticamente a instância de EloquentUserRepository
sempre que uma instância de UserRepositoryInterface
for necessária.