Extension de formulaire non-chargée

Même pas d'erreur de classe non trouvée si je mets volontairement un mauvais FQCN

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

Bonjour tout le monde !

Afin de ne pas trop me casser le c*l, j'ai créé une extension de type de formulaire afin de pouvoir utiliser jQuery.select2 lorsque j'utilise EntityType. Le code de cette extension est fourni ci-après.

J'ai donc pris la documentation, j'ai repris plusieurs fois les étapes, j'ai vérifié que mon service n'était pas surchargé par une clé malencontreusement copiée-collée pour un autre service, mais rien qui ne me soit apparu.

Le plus déroutant dans l'histoire, c'est que c'est plus du niveau de "ce service ne se définit pas" qu'autre chose, parce que :

  1. mon fichier comprend trois autres déclarations qui sont bien prises en compte ;
  2. des affichages de débogage dans la classe ne sont pas visibles ;
  3. une erreur dans le FQCN de la classe pour la définition ne change absolument rien (et surtout ne me génère pas d'erreur).

J'ai pensé en premier lieu au cache, mais même une suppression bourrine ne change rien. La manifestation la plus claire de ce que l'extension n'existe pas aux yeux de Symfony est que si je tente d'ajouter une option de champ telle que définie dans mon extension, elle n'est pas reconnue.

Est-ce que c'est déjà eu arrivé à quelqu'un ?

Merci d'avance  :)

Edit

En date d'édition et avec Symfony 3.1.3, le comportement est toujours présent.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
namespace My\WonderfulBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;

class EntitySelect2Extension extends AbstractTypeExtension
{
    protected $router;

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

    public function getExtendedType()
    {
        return EntityType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefined('search_route')
            ->setAllowedTypes('search_route', 'string');
        $resolver
            ->setDefined('search_route_params')
            ->setAllowedTypes('search_route_params', 'array')
            ->setDefault('search_route_params', array());
        $resolver
            ->setDefined('additional_search_data')
            ->setAllowedTypes('additional_search_data', 'array');
        $resolver->setDefaults(array(
            'choices' => array(),
        ));
    }

    public function finishView(FormView $view, FormInterface $form, array $options)
    {
        if (empty($options['search_route'])) {
            return;
        }
        $attr = &$view->vars['attr'];
        if (empty($attr['class'])) {
            $attr['class'] = 'select2';
        } else if (is_string($attr['class'])) {
            $attr['class'] .= ' select2';
        } else if (is_array($attr['class'])) {
            $attr['class'][] = 'select2';
        }
        $attr['data-uri'] = $this->router->generate($options['search_route'], $options['search_route_params']);
        if (!empty($options['additional_search_data'])) {
            $attr['data-additional'] = json_encode($options['additional_search_data']);
        }
    }
}

EntitySelect2Extension.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
services:
#    my_wonderful.example:
#        class: My\WonderfulBundle\Example
#        arguments: ["@service_id", "plain_value", %parameter%]

    my_wonderful.duration.type:
        class: My\WonderfulBundle\Form\Type\DurationType
        arguments:
            - "%my_wonderful.duration.min_length%"
        tags:
            - { name: form.type }

    my_wonderful.search_entity.type:
        class: My\WonderfulBundle\Form\Type\SearchEntityType
        arguments:
            - "@doctrine.orm.entity_manager"
            - "@router.default"
        tags:
            - { name: form.type }

    my_wonderful.entity_select2.extension:
        class: My\WonderfulBundle\Form\Extension\EntitySelect2Extension
        arguments:
            - "@router.default"
        tags:
            - { name: form.extension, extended_type: Symfony\Bridge\Doctrine\Form\Type\EntityType }

    my_wonderful.twig.duration:
        class: My\WonderfulBundle\Twig\DurationExtension
        public: false
        arguments:
            - "%my_wonderful.duration.min_length%"
        tags:
            - { name: twig.extension }

src/My/WonderfulBundle/Resources/config/services.yml

+0 -0

Salut,

Ça fait vraiment longtemps que je n'ai plus fait de sf2 (et jamais fait de 3), mais voici quelques questions. Désolé si elles sont bateau, je n'ai rien de mieux :/

Quand tu dis "les affichages de débug ne s'affichent pas", tu parles de echo 'echo' ou plutôt de die('horribly') ? Ça m'est déjà arrivé de ne pas pouvoir voir mes echo.

Tu peux voir ton service avec app/console debug:container ?

Est-ce que tu as des erreurs dans ton dev.log ou tes log apache qui n'auraient pas été affichées par sf3 ?

Tu peux toujours te servir de EntityType mais ton EntitySelect2Extension ne prend pas effet, ou plus rien ne marche ?

J'ai lu un peu la doc, la seule mention de finishview que j'ai vue, c'était pour affecter la vue d'unr fille depuis la classe mère, il ne faudrait pas plutôt surcharger buildview ?

Je n'ai aucune idée de comment résoudre, par contre :/

Quand tu dis "les affichages de débug ne s'affichent pas", tu parles de echo 'echo' ou plutôt de die('horribly') ? Ça m'est déjà arrivé de ne pas pouvoir voir mes echo.

melepe

Dans mon cas, même exit() n'est pas pris en compte.

Tu peux voir ton service avec app/console debug:container ?

melepe

Oui, avec les paramètres que je lui ai spécifiés…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Information for Service "my_wonderful.entity_select2.extension"
============================================================================

 ------------------ ------------------------------------------------------------------------------ 
  Option             Value                                                                         
 ------------------ ------------------------------------------------------------------------------ 
  Service ID         my_wonderful.entity_select2.extension                                      
  Class              My\WonderfulBundle\Form\Extension\EntitySelect2Extension                   
  Tags               form.extension (extended_type: Symfony\Bridge\Doctrine\Form\Type\EntityType)  
  Public             yes                                                                           
  Synthetic          no                                                                            
  Lazy               no                                                                            
  Shared             yes                                                                           
  Abstract           no                                                                            
  Autowired          no                                                                            
  Autowiring Types   -                                                                             
 ------------------ ------------------------------------------------------------------------------

J'avoue au passage ne pas comprendre à quoi se rapportent les deux-trois dernières lignes.

Est-ce que tu as des erreurs dans ton dev.log ou tes log apache qui n'auraient pas été affichées par sf3 ?

melepe

Rien qui ne me semble lié à cela, à part l'erreur elle-même comme quoi search_route n'est pas prévue pour le type. Et la barre de débogage ne me sort rien de plus.

Tu peux toujours te servir de EntityType mais ton EntitySelect2Extension ne prend pas effet, ou plus rien ne marche ?

melepe

EntityType est toujours utilisable

J'ai lu un peu la doc, la seule mention de finishview que j'ai vue, c'était pour affecter la vue d'unr fille depuis la classe mère, il ne faudrait pas plutôt surcharger buildview ?

melepe

Je n'en suis pas certain. C'est du code que j'ai repris d'un type personnalisé précédent, et du coup, vu que je devais récupérer des informations du parent, il me fallait le faire dans finishView pour pouvoir y accéder, ce qui n'est pas possible dans buildView.

+0 -0

:-°

J’avais bêtement mis le tag form.extension… c’est form.type_extension — notez bien le type qui apparaît — pour des extensions de type. Impossible de retrouver d’où je tenais cet oubli, mais c’est ça.

+0 -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