Багатокрокові форми
Реєстрацію чи оформлення замовлення на кілька екранів раніше збирали вручну або через сторонні бандли. Тепер кожен крок описується звичайним form type, номер поточного кроку живе у властивості обʼєкта даних, а кнопки «Назад», «Далі» і «Завершити» дає NavigatorFlowType. Назва кроку стає активною групою валідації, тож обмеження легко привʼязати до конкретного екрана.
use Symfony\Component\Form\Flow\AbstractFlowType;
use Symfony\Component\Form\Flow\FormFlowBuilderInterface;
use Symfony\Component\Form\Flow\Type\NavigatorFlowType;
class UserSignUpType extends AbstractFlowType
{
public function buildFormFlow(FormFlowBuilderInterface $builder, array $options): void
{
$builder->addStep('personal', PersonalType::class);
$builder->addStep('account', AccountType::class);
$builder->add('navigator', NavigatorFlowType::class);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => UserSignUp::class,
'step_property_path' => 'currentStep',
]);
}
}
// у контролері
$flow = $this->createForm(UserSignUpType::class, new UserSignUp())->handleRequest($request);
if ($flow->isSubmitted() && $flow->isValid() && $flow->isFinished()) {
return $this->redirectToRoute('signup_success');
}
return $this->render('signup.html.twig', ['form' => $flow->getStepForm()]);