Это одно из величайших правил, которое помогает сфокусировать ваши занятия и облегчить их обслуживание. Сколько раз вы видели это:
class XXXRepository
{
public function findOneByCode($code);
public function findOneByParams($params);
public function findAllByParams($params);
public function findActive($params);
public function findForProductList($params);
... 5000 lines of spaghetti
}
Вместо этого пойдите для этого, охватите интерфейсы, сделайте ваше приложение зависимым от абстракций, а не от деталей реализации:
interface ProductByCode
{
public function findByCode(string $code): ?Product;
}
interface ProductsByName
{
public function findByName(string $name): array;
}
С помощью компонента Dependency Injection вы можете создать псевдоним интерфейса для его реализации. Перейти на реализацию для каждого интерфейса. Вы можете использовать абстрактный класс, который поможет вам общаться со слоем персистентности через выбранную вами структуру.
final class ProductByCodeRepository extends BaseRepository implements ProductByCode
{
public function findByCode(string $code): ?Product
{
return $this->findOneBy(['code' => $code]);
}
}