سؤال

التكوين في سيمفوني يساوي فالدياتينغ التكوين.أريد التحقق من صحة التكوين الخاص بي مع تريبويلدر.في مثال إمل ، أعطي مثالا تماما على كيف ستبدو شجرة التكوين (في المستقبل ، ستكون الشجرة أكبر من الآن).ولكن للقيام بذلك ، أحتاج إلى إنشاء هيكل.
الآن هل يمكن أن تساعدني, لإنشاء باني الأشجار?لقد حاولت كل شيء مع أرينود والنماذج ، لكنها لن تعمل.أحصل على استثناءات مثل

"فتاليروريكسيبتيون:خطأ:استدعاء طريقة غير محددة سيمفوني \ مكون \ التكوين \ تعريف \ باني \ نوديبويلدر:: النموذج الأولي() في /فار/ووو/مينو_بوندل/سرك/بلدي/مينوبوندل/ديبندنسينجكتيون/التكوين.بي إتش بي خط 29 "


الفكرة الأساسية:

أريد إنشاء حزمة سيمفوني 2 ، مما يخلق مينوستروكتور في هتمل.لتوليد رمز هتمل ، ولست بحاجة لسحب تكوين يمل في بنية الكائن ، وهذا يعمل ، ولكن التحقق من صحة مع سيمفوني لا يعمل...


هنا مثال سريع على كيفية القائمة.يجب أن تبدو:

my_menu_structure:
    menu:
        name: test
        cssClass: blubb
        children:
            child:
                name: item1
                route: route1
                position: 0
                  child:
                    name: item11
                    route: route11
                    position: 0
              child:
                  name: item2
                  route: route2
                  position: 1

الآن أريد تكوين تريبويلدر في سيمفوني 2 ، لكنه لن يعمل..

بعد عدة مرات من المحاولة ، هذه هي نسختي الأخيرة:

    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('my_menu');
        $rootNode
            ->children()
            ->arrayNode('menu')
            ->scalarNode('cssClass')
            ->defaultValue(array())
            ->prototype('array')
                ->scalarNode('name')
                ->scalarNode('route')
                ->scalarNode('Position')
                ->prototype('array')

        ->end()
        ->end()
        ->end();

لدي بناء الكائنات لقائمة و مينويتمز.كل شيء يعمل حتى الآن ، ولكن لا يمكنني تكوين تريبويلدر.ما أنا أبحث عنه ، هو وسيلة لإعادة استخدام جزء (مينوتيم-:الاسم والطريق والأطفال) في باني الأشجار ، لكن كل ما وجدته حتى الآن ، لم يستطع مساعدتي...كل شيء آخر يعمل ، مشكلتي الوحيدة هي ، أنني لا يمكن تكوين تريبويلدر وأنا لا يمكن الحصول على التكوين من يمل مع-هذا - > حاوية- > الحصول على('menu.name').هذا يلقي استثناء:لقد طلبت خدمة غير موجودة "menu.name".

حتى الآن ، لقد حاولت بعض التكوين مع النموذج الأولي('صفيف') ، ولكن فبستورم يقول في كل مرة ، فإنه لا يمكن العثور على سكالارنود كطفل من النموذج الأولي أو ->النموذج الأولي()->الأطفال()->سكالارنود()..

هل كانت مفيدة؟

المحلول

وأنا أعلم أن هذا السؤال يعود من جانوار 2014 ، ولكن عندما تبحث عن حل لرسالة الخطأ "دعوة إلى طريقة غير محددة سيمفوني\مكون\التكوين\تعريف\باني\أراينوديفينيتيون::أراينود()" جاء هذا السؤال ستاكوفيرفلو في نتائج البحث.

الإجابة المقبولة لا تذكر في الواقع سبب رسالة الخطأ.

المثال الذي قدمه الملصق الأصلي هو كما يلي:

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_menu');
$rootNode
        ->children()
        ->arrayNode('menu')
        ->scalarNode('cssClass')
        ->defaultValue(array())
        ->prototype('array')
            ->scalarNode('name')
            ->scalarNode('route')
            ->scalarNode('Position')
            ->prototype('array')

    ->end()
    ->end()
    ->end();

هذا غير صحيح لأن كل عقدة يجب أن تنتهي بـ end() اتصل.كما تنص[الوثائق] [1] :

بشكل عام:بعد تحديد عقدة ، دعوة لإنهاء () يأخذك خطوة واحدة حتى في التسلسل الهرمي.

في حالتي الخاصة ، ما كان غير واضح بالنسبة لي ، كان حقيقة أنه في الدفاع أرينود على حد سواء arrayNode() التعريف على أنه الأساس children() يجب إنهاء التعريف.

لذا فإن المثال أعلاه سيكون صحيحا على النحو التالي:

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_menu');
$rootNode
    ->children()
        ->scalarNode('cssClass')->end()
        ->arrayNode('menu')
            ->prototype('array')
                ->scalarNode('name')->end()
                ->scalarNode('route')->end()
                ->scalarNode('Position')->end()
            ->end()
        ->end()
    ->end()
->end();

نأمل أن يساعد هذا الآخرين في حل المشكلة بشكل أسرع مما فعلت.

نصائح أخرى

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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top