2012-03-26 11 views
7

मैं एक फार्म बिल्डर वर्ग जो AbstractType से विरासत है हल करने के लिए और मैं इस तरह एक पथ को हल करने की जरूरत है:कैसे symfony2 में एक गैर नियंत्रक कक्षा में एक पथ

$uri = $router->generate('blog_show', array('slug' => 'my-blog-post')); 

के बाद से वर्ग का एक बच्चा नहीं है Controller मेरे पास राउटर तक पहुंच नहीं है। कोई विचार?

निर्माण समय पर कक्षा में राउटर को पार करने के बारे में क्या?

उत्तर

16

आप अपने फॉर्म प्रकार के निर्माता के माध्यम से router सेवा पास कर सकते हैं। form.type टैग के साथ अपने फॉर्म को सेवा के रूप में पंजीकृत करें और router सेवा को इंजेक्ट करें।

<?php 
namespace Vendor\Bundle\AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Bundle\FrameworkBundle\Routing\Router; 

class PostType extends AbstractType 
{ 
    /** 
    * @var Router 
    */ 
    private $router; 

    /** 
    * @param Router 
    */ 
    public function __construct(Router $router) 
    { 
     $this->router = $router; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'post'; 
    } 

    // ... 
} 

एक सेवा के रूप में यह रजिस्टर:

services: 
    form.type.post: 
     class: Vendor\Bundle\AppBundle\Form\Type\PostType 
     arguments: [ @router ] 
     tags: 
      - { name: form.type } 

और इस तरह अपने नियंत्रक में उपयोग:

public function addAction(Request $request) 
{ 
    $post = new Post(); 
    $form = $this->createForm('post', $post); 

    // ... 
} 

जब से तुम form.type टैग के साथ एक सेवा के रूप में अपने प्रपत्र प्रकार पंजीकृत, आप बस new PostType() के बजाय इसका नाम उपयोग कर सकते हैं। और आप router सेवा को $this->router पर अपने प्रकार में एक्सेस कर सकते हैं।

+0

क्या आप 'तर्क: [@router] 'के लिए php टेम्पलेट संस्करण कोड निर्दिष्ट कर सकते हैं? –

+0

[इस अनुभाग] में PHP टैब देखें (http://symfony.com/doc/current/book/service_container.html#referencing-injecting-services)। –

0

आप इस वर्ग को सेवा के रूप में परिभाषित कर सकते हैं और इसमें राउटर सेवा इंजेक्ट कर सकते हैं।

अधिक जानकारी: Service Container

1

आप कुछ नियंत्रक में अपने फ़ॉर्म बिल्डर वर्ग का उपयोग करने जा रहे हैं, तो आप इसे और अधिक सरल और आपके प्रपत्र बिल्डर और अधिक लचीला जा रहा कर सकते हैं:

public function someAction() { 
    //... 

    $task = new Task(); 
    $form = $this->createForm(new TaskType(), $task, array(
     'action' => $this->generateUrl('target_route'), 
     'method' => 'GET', 
    )); 
} 

प्रपत्र प्रकार में URL सेट करने के लिए कोई जरूरत नहीं है कक्षा। यहां और पढ़ें: http://symfony.com/doc/current/form/action_method.html

संबंधित मुद्दे