3
respostas

[Dúvida] Sobre a interface de repositório

Boa noite. O professor disse que agora que criamos uma interface do repositório, posso por exemplo usar essa interface em teste. Porém fiquei com uma dúvida, eu já tenho o EloquentSerieRepository implementando a interface ISerieRepository, se eu criar uma classe TesteRepository implementando ISerieRepository, vou ter que mudar quem o Laravel vai instanciar quando chamar essa interface e então o resto do código que precisa da implementação com Eloquent não vai funcionar.

3 respostas

Karolina, quando você for criar um teste para alguma classe que precisa do repositório e não quiser acessar o banco realmente, ou seja, quando precisar de um dublê, ter a interface vai ser útil pois você pode passar qualquer implementação da interface. Você pode, por exemplo, ter uma implementação em memória:

class InMemorySeriesRepository implements SeriesRepository
{
    private array $seriesList = [];

    public function add(SeriesFormRequest $request): Series
    {
        $series = // criar a série a partir do request
        $this->seriesList[] = $series;

        return $series;
    }
}

Sim. Isso entendi. Porei não tenho que informar ao container de dependência do Laravel que quando eu chamar a interface SerieRepository que é para instanciar a classe InMemorySeriesRepository? A questão é que se eu fizer isso minha classe EloquentSerieRepository deixa de funcionar certo? ´Pergunto para entender como vou usar duas implementações diferentes para a mesma classe sem afetar a aplicação.

Não, Karolina. Você pode ter configurações diferentes para ambientes diferentes. No ambiente de testes usar uma implementação e em dev/prod, outra.