Как заполнять unmapped поле в EasyBundle?

В 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 поля для различных целей, например, для расчета или отображения информации, не связанной с моделью данных.