User, как можно абстрагироваться от интерфейсов Symfony?
Будет ли правильным решением поменять User на AbstractUser и рядом поместить например SymfonyUser, который уже будет реализовывать интерфейсы Symfony?
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
public function __construct(
private ?Id $id,
private Status $status,
private Email $email,
private bool $isEmailVerified,
private Role $role,
private HashedPassword $hashedPassword,
private DateTimeImmutable $createdAt,
private ?DateTimeImmutable $updatedAt = null,
private ?DateTimeImmutable $activityAt = null,
) {
}
}
Привет! Если вы хотите абстрагироваться от интерфейсов Symfony в слое домена, вы можете использовать принцип инверсии зависимостей (Dependency Inversion Principle, DIP) и применить подход "чистой архитектуры" (Clean Architecture) или "архитектуры на основе гексагона" (Hexagonal Architecture). Вариант с созданием абстрактного класса AbstractUser и класса SymfonyUser, реализующего интерфейсы Symfony, может быть одним из способов реализации такой абстракции. Однако, если ваша сущность User не имеет прямой зависимости от фреймворка Symfony и интерфейсов Symfony, то добавление абстрактного класса может быть излишним. Вместо этого вы можете просто использовать класс User без изменений и сохранить его независимым от фреймворка Symfony. Если вам понадобится использовать объекты User в контексте Symfony, вы можете создать отдельные классы-адаптеры или слои инфраструктуры, которые будут работать с объектами User и взаимодействовать с фреймворком Symfony через интерфейсы. Например, в вашем случае, вы можете создать класс SymfonyUserAdapter, который реализует интерфейсы Symfony и внутри себя содержит экземпляр класса User. Это позволит вам использовать объекты User в контексте Symfony, но при этом сохранит сущность User независимой от фреймворка. php class SymfonyUserAdapter implements UserInterface, PasswordAuthenticatedUserInterface { private User $user; public function __construct(User $user) { $this->user = $user; } // Реализация методов интерфейсов Symfony, делегирующих вызовы объекту User public function getUsername(): string { return $this->user->getEmail(); // Например, использование email вместо username } // Реализация остальных методов интерфейсов Symfony } Таким образом, класс SymfonyUserAdapter адаптирует объект User для использования в контексте Symfony, не требуя изменений в самом классе User и не делая его зависимым от Symfony.
Симфони не реализует интерфейсы в сущеностях доктрины
Обсуждают сегодня