Accessing the bound's entity to a Symfony form type inside the buildForm function
Published on 2021-03-16 • Modified on 2021-03-16
In this snippet, we will see how to access the bound's entity to a Symfony form type inside the buildForm
function. We just have to call the getData()
function on the form builder object. This is useful when wanting to create dynamic forms depending on the entity current state. Note that if your form type is instantiated multiple times in a given request, you should use events to modify it (check the documentation link below).
<?php
declare(strict_types=1);
// src/Form/ArticleType.php
namespace App\Form;
use App\Entity\Article;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
/**
* Fake article form for snippet30.
*/
final class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$article = $builder->getData();
if (!$article instanceof Article) {
throw new \RuntimeException('Invalid entity.');
}
if ($article->isArticle() || $article->isSnippet()) {
$builder->add('slug', TextType::class, ['constraints' => [new NotBlank()]]);
}
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'csrf_protection' => false,
'data_class' => Article::class,
'constraints' => [
new UniqueEntity(['fields' => ['slug']]),
],
]);
}
}
More on Stackoverflow Read the doc Random snippet
Call to action
Did you like this post? You can help me back in several ways: (use the "reply" link on the right to comment or to contact me )
- Report any error/typo.
- Report something that could be improved.
- Like and repost!
- Follow me on Bluesky 🦋
- Subscribe to the RSS feed.
- Click on the More on Stackoverflow buttons to make me win "Announcer" badges 🏅.
Thank you for reading! And see you soon on Strangebuzz! 😉