В Symfony при разработке приложений часто используется бандл EasyBundle, который предоставляет удобные инструменты для работы с формами. Возникает вопрос о том, как заполнить unmapped поле в EasyBundle.
Unmapped поле - это поле формы, которое не соответствует никакому полю в сущности или базе данных. Это может быть поле, которое нужно только для отображения или для обработки какой-либо логики, но не нужно сохранять его значения.
Для заполнения unmapped полей в EasyBundle используется промежуточный метод в форме. Давайте рассмотрим пример.
Предположим, у нас есть сущность User с полями name и email, и мы хотим добавить unmapped поле age в форму, чтобы показывать возраст пользователя, но не сохранять его:
// src/Entity/User.php namespace AppEntity; use DoctrineORMMapping as ORM; /** * @ORMEntity() */ class User { /** * @ORMId() * @ORMGeneratedValue() * @ORMColumn(type="integer") */ private $id; /** * @ORMColumn(type="string") */ private $name; /** * @ORMColumn(type="string") */ private $email; // геттеры и сеттеры для всех полей }
// src/Form/UserType.php namespace AppForm; use AppEntityUser; use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreTypeTextType; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentOptionsResolverOptionsResolver; class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class) ->add('email', TextType::class) ->add('age', TextType::class, [ 'mapped' => false, // определяет, что это unmapped поле ]); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => User::class, ]); } }
Теперь, при создании формы на основе UserType, Symfony будет включать поле "age" в форму, но не будет пытаться сохранить его значение в базу данных.
// src/Controller/UserController.php namespace AppController; use AppEntityUser; use AppFormUserType; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationRequest; use SymfonyComponentRoutingAnnotationRoute; class UserController extends AbstractController { /** * @Route("/user/create", name="user_create") */ public function createUser(Request $request) { $user = new User(); $form = $this->createForm(UserType::class, $user); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // обработка формы и сохранение данных в базу данных // значения unmapped поля age могут быть доступны следующим образом: $age = $form->get('age')->getData(); // использовать полученные данные как угодно return $this->redirectToRoute('user_list'); } return $this->render('user/create.html.twig', [ 'form' => $form->createView(), ]); } }
В представлении "user/create.html.twig" форма может быть отображена таким образом:
{# templates/user/create.html.twig #} {{ form_start(form) }} {{ form_row(form.name) }} {{ form_row(form.email) }} {{ form_row(form.age) }} <button type="submit">Сохранить</button> {{ form_end(form) }}
В итоге, при отправке формы будет выполняться обработка данных, все поля будут сохранены в базе данных, кроме unmapped поля "age". Значение этого поля можно получить с помощью $form->get('age')->getData()
. Это позволяет использовать unmapped поля для различных целей, например, для расчета или отображения информации, не связанной с моделью данных.