Я ищу для реализации эта стратегия для использования классов данных Symfony Form более формальным, общим способом.
tl; dr: Основная идея состоит в том, чтобы собрать данные формы в плоский толерантный объект, а затем выполнить проверку. В случае проверки заполните данные формы в более строгую иерархическую структуру объекта ORM. При изменении существующих данных сначала инициализируйте данные формы из данных ORM.
В своей самой упрощенной, неподдерживаемой, ковариантной форме это выглядит примерно так:
abstract class FormDataInterface
{
protected $entity;
public function __construct(EntityInterface $entity)
{
$this->entity = $entity;
}
abstract public static function initialize(EntityInterface $entity): self;
abstract public function populate(): void;
}
/**
* Each concrete child is a two-way adaptor responsible for defining its own
* data members and rules for populating initial form data and repopulating the
* data back into the entity. (In practice, this is very unique and sometimes
* complicated)
*/
class UserData extends FormDataInterface
{
private $name;
public function __construct(UserEntity $user)
{
parent::__construct($user);
}
// accessors for private members
public static function initialize(UserEntity $user): self
{
$userData = new self($user);
$userData->setName($user->getName());
return $userData;
}
public function populate(): void
{
$this->entity->setName($this->name);
}
}
Проблема заключается в специализации EntityInterface для конкретной конкретной сущности. Правила системы указывают, что каждый конкретный класс данных формы будет связан с определенной сущностью. Также я хочу иметь возможность определять методы initialize () и populate () как-то в договоре.
Я прочитал Эта проблема. И паттерн стратегии, и паттерн моста кажутся жизнеспособными, но я не совсем понимаю, как решить проблему ковариации.
Задача ещё не решена.
Других решений пока нет …