Frage

Die Konfiguration in Symfony ist gleichwertig, dass die Konfiguration validiert wird. Ich möchte meine Konfiguration mit dem Treebuilder überprüfen. Im YML-Beispiel gebe ich ein ziemlich ein Beispiel dafür, wie der Config-Tree aussehen wird (in Zukunft wird der Baum noch größer als jetzt). Aber dafür brauche ich a, um eine Struktur zu erstellen. Kummer Hast du mir jetzt helfen, um den Treebuilder zu erstellen? Ich habe alles mit Arraynode und Prototypen ausprobiert, aber es funktioniert nicht. Ich bekomme Ausnahmen wie

"FataleRerRorException: Fehler: Aufruf in undefined Methode Symfony \ Component \ config \ Definition \ Builder \ NodeBuilder :: Prototyp () in /var/www/menu_bundle/src/my/menubundle/dependenceise uneinheit/configuration.php line 29"


Basisidee:

Ich möchte ein Symfony2-Bundle erzeugen, das in HTML eine Menustructure erstellt. Um den HTML-Code zu generieren, muss ich die YAML-Konfiguration in eine Objektstruktur ziehen, diese funktioniert, aber die Validierung mit Symfony funktioniert nicht ...


Hier ist ein kurzes Beispiel, wie das Menü.yml aussehen soll:

generasacodicetagpre.

Jetzt möchte ich den Treebuilder in Symfony2 konfigurieren, aber es funktioniert nicht ..

Nach ein paar Malen des Versuchens ist dies meine letzte Version:

generasacodicetagpre.

Ich habe die Objekte für Menü und Menuitems erstellen. Alles funktioniert bisher, aber ich kann den Treebuilder nicht konfigurieren. Was ich suche, ist ein Weg, um einen Teil (MENSUITEM-: Name, Route und Kinder) im Baumbauer wiederzuverwenden, aber alles, was ich bisher gefunden habe, konnte mir nicht helfen ... Alles andere funktioniert, mein einziges Problem ist, dass ich den Treebuilder nicht konfigurieren kann, und ich kann die Konfiguration nicht aus dem YML mit $ this-> container-> abrufen ('menu.name'). Dies wirft eine Ausnahme: Sie haben einen nicht vorhandenen Dienst "menu.name" angefordert.

Bisher habe ich eine Konfiguration mit Prototyp ('Array') ausprobiert, aber PHPSTorm sagt jedes Mal, dass es keine Scalarnode als Kind des Prototyps oder von -> Prototyp () -> Kinder () - > ScalarNode () ..

War es hilfreich?

Lösung

Ich kenne diese Frage von Januari 2014, jedoch, wenn Sie jedoch nach einer Lösung für die Fehlermeldung "Anruf an undefined Methode symfony \ component \ config \ definition \ builder \ arraynodedefinition :: arraynode ()" Diese StackOverflow-Frage kam jedoch auf die Suchergebnisse.

Die akzeptierte Antwort erwähnt nicht eigentlich den Grund der Fehlermeldung.

Das vom Originalplakat angegebene Beispiel ist wie folgt:

generasacodicetagpre.

Dies ist falsch, da jeder Knoten mit einem generationspflichtigen Anruf beendet werden muss. Wie die [Dokumentation] [1] heißt es:

Im Allgemeinen: Nach dem Definieren eines Knotens bringt Sie ein Anruf an Ende () einen Schritt in der Hierarchie.

in meinem eigenen Fall, was mir unklar war, war die Tatsache, dass in einer ArrayNode-Defizierung sowohl die end()-Definition als die zugrunde liegende arrayNode()-Definition beendet werden muss.

Das obige Beispiel wäre wie folgt korrekt:

generasacodicetagpre.

Hoffentlich hilft dies anderen, das Problem schneller zu reparieren als ich.

Andere Tipps

what you can do is to configure your rootNode this way:

    $rootNode
        ->children()
            ->arrayNode('menu')
            ->isRequired()
            ->prototype('array')
                ->children()
                ->scalarNode('label')->isRequired()->end()
                ->scalarNode('class')->end() // I added an optional class parameter
                //others parameters
                    ->arrayNode('sub_menu')
                        ->prototype('array')
                        ->children()
                            ->scalarNode('label')->isRequired()->end()
                            ->scalarNode('route')->end()
                            ->scalarNode('class')->end()
                            // add as many parameters as you want for your children
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->end()
        ->end();

Then you want to pass this variable to a service. Very simple class :

class AdminMenu
{

    protected $menu;

    public function setMenu($menu)
    {
        $this->menu = $menu;
    }

    public function getMenu()
    {
        return $this->menu;
    }


}

In you services.xml

    <parameter key="wf.admin_menu.class">Acme\AdminBundle\Library\AdminMenu</parameter>

    <service id="wf.admin_menu" class="%wf.admin_menu.class%">
    </service>

In your bundleAdminExtension class

    $myServiceDefintion = $container->getDefinition('wf.admin_menu');
    $myServiceDefintion->addMethodCall('setMenu', array($config['menu']));

Finally, in any controller you want:

 $menu = $this->container->get('wf.admin_menu');

That's all :)

Edit : Here's what my config looks like

my_bundle_admin:
  menu:
    unique_key:
      label : 'Level1-1'
      class : ''
      sub_menu:
        sub_unique_key1:
          label: 'Level2-1'
          route: 'my_route'
        sub_unique_key2:
          label: 'Level2-2'
          route: 'my_route'
    unique_key_2:
      label : 'Level1-2'
      sub_menu :
        sub_unique_key1:
          label : 'Level2-1'
          route : 'my_route'
        sub_unique_key2:
          label : 'Level2-2'
          route : 'my_route'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top