условно вам не нужно больше писать в коде свой query builder, вы делегируете это интерфейсу репозитория. У каждой сущности свой интерфейс репозитория, не нужно писать общий интерфейс для всех сущностей.
Например, если в коде у вас было:
$companyEmployees = $entityManager
->createQueryBuilder()
->where('companyId = :company')
->where('active = true')
->fetchCollection();
то этот код заменяется на интерфейс
interface CompanyRepository {
public function getActiveEmployees(): array;
}
а в коде вызывается метод этого интерфейса, при этом реализация уже может быть любой
class DoctrineCompanyRepository implements CompanyRepository {
public function getActiveEmployees()
{
return $entityManager
->createQueryBuilder()
->where('companyId = :company')
->where('active = true')
->fetchCollection();
}
}
class EloquentCompanyRepository implements CompanyRepository {
public function getActiveEmployees()
{
return Company::where()->where()->get();
}
}
class MockCompanyRepository implements CompanyRepository {
public function getActiveEmployees()
{
return [new Employee($name, $position), new Employee($name2, $position2)];
}
}
class SqlCompanyRepository implements CompanyRepository {
public function getActiveEmployees()
{
return Db::query('select * from company_employees t where t.company_id = :id and ...')->fetchAll();
}
}
соответственно в вашем коде вы должны передать объект нужного репозитория
class CompanyController
{
public function fireAllAction()
{
$companyService = new CompanyService(new DoctrineCompanyRepository());
...
}
}
class CompanyServiceTest
{
public function testFireAllMethod()
{
$companyService = new CompanyService(new MockCompanyRepository());
}
}