هيكل العودية في يمل مع سيمفوني 2 تريبويلدر
-
21-12-2019 - |
سؤال
التكوين في سيمفوني يساوي فالدياتينغ التكوين.أريد التحقق من صحة التكوين الخاص بي مع تريبويلدر.في مثال إمل ، أعطي مثالا تماما على كيف ستبدو شجرة التكوين (في المستقبل ، ستكون الشجرة أكبر من الآن).ولكن للقيام بذلك ، أحتاج إلى إنشاء هيكل.
الآن هل يمكن أن تساعدني, لإنشاء باني الأشجار?لقد حاولت كل شيء مع أرينود والنماذج ، لكنها لن تعمل.أحصل على استثناءات مثل
"فتاليروريكسيبتيون:خطأ:استدعاء طريقة غير محددة سيمفوني \ مكون \ التكوين \ تعريف \ باني \ نوديبويلدر:: النموذج الأولي() في /فار/ووو/مينو_بوندل/سرك/بلدي/مينوبوندل/ديبندنسينجكتيون/التكوين.بي إتش بي خط 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'