Как сделать класс формы для 2 разных сущностей, используя symfony 4? - PullRequest
0 голосов
/ 12 марта 2019

Здравствуйте, я использую Symfony 4,

Я хочу создать formClass, который будет вставлять данные для 2 различных объектов, таких как «vendor» и «address».Пожалуйста, объясните мне, как я могу создать класс формы для приема данных для 2 разных сущностей через одну и ту же форму?

Я создал класс формы, который принимает данные только для одной сущности, но я не собираюсь создавать класс формы, который принимает данные для2 разных объекта?

По сути, я не собираюсь объединять форму в одно целое.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Прежде всего, не используйте тип объекта, создайте свой собственный DTO (Data Transfer Object). Я предполагаю, что обе эти сущности имеют общие поля. Таким образом, вы можете создать фасад, который поможет вам конвертировать DTO в типы ваших сущностей.

Создайте свой DTO, основываясь на запросе, а не на фактической сущности, это имеет большое преимущество, поскольку ваш код менее связан и более гибок для изменений в будущем, хотя и требует дополнительной работы. Например, вам нужно самостоятельно заполнить DTO и преобразовать его обратно в сущности, основанные на какой-то стратегии, в вашем случае это будет поставщик и доступ.

Есть хорошая статья, объясняющая, как сделать это в деталях, вы можете посмотреть на нее https://blog.martinhujer.cz/symfony-forms-with-request-objects/

0 голосов
/ 12 марта 2019

объединить формы (предпочтительно)

Предполагая, что у вас есть две сущности Vendor и Address и формы для этих сущностей VendorType и AddressType, вы можете создать тип формы VendorAddressType, который в качестве функции buildForm имеет

$builder->add('vendor', VendorType::class)
        ->add('address', AddressType::class);

и при создании формы VendorAddressType вы предоставляете массив ['vendor' => $vendor, 'address' => $address]. (вы можете аналогичным образом передавать опции в подформы). Параметр data_class для каждой подчиненной формы может быть соответствующим классом, параметр data_class для комбинированной формы должен быть null.

теперь, в обычных шаблонах форм Symfony, эти формы отображаются иначе, чем на самом деле в одной форме, но эти шаблоны могут быть расширены, так что вместо form_row s вы вызываете form_widget для form.vendor и form.address вместо (см. https://symfony.com/doc/current/form/form_themes.html#creating-a-form-theme-in-the-same-template-as-the-form)

объединить формы буквально (не предпочтительно)

То же предположение, что и раньше, вы можете скопировать содержимое каждого типа формы в новую форму VendorAddress, а затем установить атрибут property_path для всех полей, чтобы они указывали на соответствующие объекты, например:

$builder->add('vendorfieldA', SomeType::class, ['property_path' => 'vendor.fieldA'])

, который будет смотреть в предоставленном массиве данных (см. Выше) на ключ vendor и выбирать его свойство fieldA.

Я бы не советовал этому подходу, поскольку любые изменения в формах с одним объектом должны повторяться для форм с несколькими объектами. Вместо этого я бы посоветовал создавать статические функции buildForm (добавляя параметр prefix или что-то в этом роде), которые можно вызывать из комбинированного типа формы через VendorType::staticBuildForm($builder, $prefix) ($prefix = 'vendor.'). (вы должны преобразовать этот префикс в нечто, что вы также можете добавить / добавить к имени поля формы или указать это явно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...