Схема расчета популяции двунаправленных данных - PullRequest
0 голосов
/ 02 февраля 2019

Я стремлюсь реализовать эту стратегию для использования классов данных 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 () каким-либо образом в контракте.

Я прочитал эту проблему .И паттерн стратегии, и паттерн моста кажутся жизнеспособными, но я не совсем понимаю, как решить проблему ковариации.

...