Type personnalisé : service non utilisé

Le problème exposé dans ce sujet a été résolu.

Bonjour !

Nous sommes deux à avoir planché dessus, et on n’arrive pas à trouver ce qui manque ou ce qui n’est pas correct… donc je tente d’avoir au moins une paire d’yeux externe.

Je suis en train de créer un type de formulaire personnalisé sur une application en Symfony 2.8. C’est une liste de valeurs qui initialement était en base de données, mais je suis en train de l’extérioriser dans un fichier de configuration, et du coup c’est extrêmement similaire à ce qu’explique la documentation. La différence que je vois, c’est qu’au lieu de mettre les paramètres directement dans parameters.yml, ils sont dans un autre fichier qui lui est importé.

Avec l’aide de debug:container, je vois que mon service est listé avec les bonnes informations, tout comme mon paramètre avec les bonnes valeurs. Je n’ai pas redéfini le service ailleurs, donc pas d’écrasement (et si c’était le cas, je pense que je n’aurais pas les bonnes informations avec debug:container).

Cependant, quand je tente d’utiliser mon type personnalisé, aucun paramètre ne lui est passé (erreur comme quoi il en attend un et rien n’est fourni). J’ai tenté de simplement changer le paramètre pour passer un service et changer l’erreur, mais ça n’a pas eu l’effet escompté — ça n’a pas même eu d’effet.

Evidemment, j’ai purgé le cache, redémarré Apache, je suis même allé jusqu’à mettre à jour ma version de PHP (passé de 7.1.20 à .23), et j’en suis toujours au même point.

Est-ce que quelqu’un verrait ce qui m’a échappé ?

Merci d’avance.

Type error: Too few arguments to function Mon\BôBundle\Form\ActivityTypeType::__construct(), 0 passed

parameters:
  activity.types:
    edition:
      icon: "fa-edit"
    creation:
      icon: "fa-plus-square"
    removal:
      icon: "fa-trash"
activityTpes.yml
imports:
  - { resource: "activityTypes.yml" }

services:
  monbo.form.activity_type:
    class: "Mon\\BôBundle\\Form\\ActityTypeType"
    arguments:
      - "%activity.types%"
    tags:
      - { name: "form.type" }
services.yml
<?php
namespace Mon\BôBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ActivityTypeType extends AbstractType
{
    private $activityTypes;

    public function __construct(array $activityTypes)
    {
        $this->activityTypes = $activityTypes;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'choices' => $this->activityTypes,
            'choice_name' => 'identifier',
        ));
    }

    public function getParent()
    {
        return ChoiceType::class;
    }
}
\Mon\BôBundle\Form\ActivityTypeType
            ->add('type', \Mon\BôBundle\Form\ActivityTypeType::class, array(
                'required' => false,
                'choice_label' => 'icon',
//                 'choice_translation_domain' => null,
            ))
La seule utilisation actuelle. J’ai aussi testé de mettre uniquement le nom de la classe sans le namespace — le formulaire utilisant mon ActivityTypeType partage le même espace de noms
+0 -0

Merci. La seule différence est qu’il définit un alias pour le type de champ (ce qui n’est plus conseillé pour Symfony 2.8 et ne fonctionne plus dès Symfony 3, si je me souviens bien), au même titre que l’étaient les types sous forme de texte au début de Symfony 2. Je verrai pour tester, mais j’aimerais cependant relever que j’ai deux autres champs créés de manière similaire à celui qui ne fonctionne pas, je les utilise de la même manière, et évidemment là je n’ai pas de souci…

Ces autres types sont d’ailleurs définis dans le même fichier de services, j’ai copié-collé une des définitions et ai modifié la classe, l’identifiant du service et le paramètre à passer.

+0 -0

Voici.

<?php

namespace Mon\BôBundle\Form;

use Mon\BôBundle\Form\DataTransformer\IdToPersonTransformer;
use Doctrine\ORM\EntityManager;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

/**
 * @see \Mon\BôBundle\Form\DataTransformer\IdToPersonTransformer
 * @see @Monbo\Form\person-autocomplete.html.twig
 */
class PersonAutocompleteType extends AbstractType
{
    /**
     * @var EntityManager
     */
    protected $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addViewTransformer(new IdToPersonTransformer($this->em));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if (($person = $form->getData()) instanceof \Mon\TrèBôBundle\Entity\Person) {
            $view->vars['attr']['data-id'] = $person->getId();
        }
    }

    public function getParent()
    {
        return TextType::class;
    }
}
Un exemple fonctionnel
services:
  monbo.form.type.personAutocomplete:
    class: "Mon\\BôBundle\\Form\\PersonAutocompleteType"
    arguments:
      - "@doctrine.orm.default_entity_manager"
    tags:
      - { name: "form.type" }
La déclaration du service (quelques lignes au-dessus de ce qui ne fonctionne pas)
->add('person', PersonAutocompleteType::class, array(
    'required' => false,
))
L’utilisation dans un autre formulaire

Alors certes, je n’utilise pas le paramètre qui lui est passé (c’est un reliquat d’une autre version du type), mais cependant le paramètre est passé.

+0 -0

Hé ben pas loin !

Si je mets l’identifiant ….activity_type, ça ne passe pas. Mais si je colle au nom de la classe, donc ….activity_type_type, , ça fonctionne !  o_O

Donc dans Symfony 2.8, il devait déjà y avoir des éléments pour l'autowiring

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte