Lors du développement d’une application Symfony2 multibases de données, on peut être amené à devoir transmettre un EntityManager particulier à un formulaire, pour l’affichage des données.
Tout se passe dans le fichier php du formulaire concerné, dans notre cas CustomElemFormType.php.
L’opération va consister à définir manuellement les paramètres à passer au formulaire. Pour cela, il suffit d’ajouter les deux méthodes suivantes :
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'CDC\TestBundle\Entity\CustomElem'));
$resolver->setRequired(array('em'));
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'CDC\TestBundle\Entity\CustomElem',
'em' => null,);
}
La première méthode va permettre de définir le paramètre em, correspondant à l’EntityManager, comme paramètre requis lors de l’appel au formulaire.
La deuxième permet de retourner une valeur par défaut lors de la lecture des paramètres du formulaire.
Il reste encore à utiliser ce paramètre dans la déclaration des champs du formulaire. Voici le code complet :
namespace CDC\TestBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class CustomElemType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
// Récupération de l'EntityManager passé en paramètre
$em = $options['em'];
$builder->add('category','entity', array('class' => 'CDC\TestBundle\Entity\Category',
'property'=>'description',
// L'utilisation de l'EntityManager permet de cibler une base particulière
'em' => $em,
'label' => 'Catégorie',));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'CDC\TestBundle\Entity\CustomElem'));
$resolver->setRequired(array('em'));
}
public function getDefaultOptions(array $options)
{
return array('data_class' => 'CDC\TestBundle\Entity\CustomElem',
'em' => null,);
}
public function getName()
{
return 'cdc_testbundle_customelemtype';
}
}
Voilà notre formulaire est prêt. Il ne reste plus qu’à l’utiliser dans le contrôleur adéquat :
$form = $this->createForm(new CustomElemType, $customElem, array('em' => $managerName));
Voilà, maintenant c’est à vous …
A bientôt !