Laravel Contracts

Laravel
Tempo de leitura: 4 minutos

Laravel Contracts: O Laravel, um dos frameworks PHP mais populares, oferece uma variedade de ferramentas e padrões de projeto para criar aplicações robustas e escaláveis. Um desses padrões, os contratos, desempenham um papel fundamental na organização do código e na promoção da testabilidade.

Neste artigo, vamos explorar em detalhes o conceito de contratos no Laravel, comparando-os com as Facades, discutindo quando utilizá-los e apresentando exemplos práticos de sua implementação.

Contracts vs Facades: Qual a Diferença?

Facades são interfaces estáticas que fornecem um acesso conveniente aos serviços do Laravel. Elas simplificam a utilização de funcionalidades como banco de dados, cache, sessões, entre outros. No entanto, o uso excessivo de facades pode dificultar a testabilidade e a manutenção do código, pois as dependências não são explicitamente declaradas.

Contratos, por outro lado, são interfaces que definem os métodos e propriedades que um serviço deve implementar. Ao utilizar contratos, você desacopla as classes da implementação específica de um serviço, tornando o código mais flexível e testável.

CaracterísticaFacadesContratos
NaturezaInterface estáticaInterface
DependênciasOcultasExplicitamente declaradas
TestabilidadeDificulta a testabilidadeFacilita a testabilidade
FlexibilidadeMenos flexívelMais flexível

Quando Usar Contratos?

  • Quando a testabilidade é importante: Ao utilizar contratos, você pode facilmente criar mocks e stubs para testar suas classes, isolando a lógica de negócio das dependências externas.
  • Quando a flexibilidade é necessária: Contratos permitem trocar a implementação de um serviço sem afetar o resto da aplicação.
  • Quando você precisa definir uma API clara para um serviço: Contratos definem um contrato explícito entre diferentes partes da aplicação, facilitando a compreensão do código.

Como Usar Contratos

1. Criando um Contrato:

Bash

php artisan make:interface UserRepository

Isso gerará o arquivo app/Contracts/UserRepository.php, onde já criamos dois métodos, find e create:

PHP

namespace App\Contracts;

interface UserRepositoryContract
{
    public function find(int $id);
    public function create(array $data);
}

2. Implementando o Contrato:

Bash

php artisan make:repository UserRepository

Isso gerará o arquivo app/Repositories/UserRepository.php que implementa o contrato. Aqui também já inserimos um pouco de lógica!

PHP

namespace App\Repositories;

use App\Contracts\UserRepositoryContract;
use Illuminate\Database\Eloquent\Model;

class UserRepository implements UserRepositoryContract
{
    protected $model;

    public function __construct(Model $model)
    {
        $this->model = $model;
    }

    public function find(int $id)
    {
        return $this->model->find($id);
    }

    public function create(array $data)
    {
        return $this->model->create($data);
    }
}

3. Injetando a Dependência:

PHP

namespace App\Services;

use App\Contracts\UserRepositoryContract;

class UserService
{
    protected $userRepository;

    public function __construct(UserRepositoryContract $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function getUserById($id)
    {
        return $this->userRepository->find($id);
    }
}

4. Registrando no Container de Serviços:

PHP

// app/Providers/AppServiceProvider.php

public function register()
{
    $this->app->bind(UserRepositoryContract::class, UserRepository::class);
}

5. Utilizando o Contrato:

PHP

// Em algum controller ou service
public function showUser($id)
{
    $user = $this->userService->getUserById($id);
    // ...
}

Benefícios de Usar Contratos

  • Melhora a testabilidade: Facilita a criação de testes unitários, pois você pode facilmente substituir a implementação real do contrato por um mock.
  • Aumenta a flexibilidade: Permite trocar a implementação de um serviço sem afetar o resto da aplicação.
  • Melhora a organização do código: Promove uma melhor organização do código, separando as interfaces das implementações.
  • Facilita a manutenção: Torna o código mais fácil de entender e manter.

Conclusão

Laravel Contracts: Os contratos são uma ferramenta poderosa no arsenal do desenvolvedor Laravel. Ao utilizar contratos, você pode criar aplicações mais limpas, testáveis e flexíveis. Ao desacoplar as classes da implementação específica de um serviço, você garante que sua aplicação seja mais fácil de manter e evoluir ao longo do tempo.

Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:

HTML
HTML
CSS
CSS
Javascript
JavaScript
SQL
SQL
Capa Curso PHP
PHP

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime
Author: Thiago Rossi