2012-03-26 5 views
7

ich eine Formular-Builder-Klasse habe, die von AbstractType erbt, und ich brauche einen Weg, wie dieses Problem zu beheben:Wie man einen Pfad in einer nicht Controller-Klasse in Symfony2 lösen

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

Da die Klasse nicht ein Kind ist Controller Ich habe keinen Zugriff auf den Router. Irgendwelche Ideen?

Wie wäre es, den Router zur Bauzeit an die Klasse zu übergeben?

Antwort

16

Sie können den router-Dienst über Konstruktor an Ihren Formulartyp übergeben. Registrieren Sie Ihr Formular als Service mit dem Tag form.type und injizieren Sie den Service 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'; 
    } 

    // ... 
} 

als Service registrieren:

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

und verwenden Sie es in Ihrem Controller wie folgt aus:

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

    // ... 
} 

Da Sie Ihren Formulartyp als Dienst mit dem Tag form.type registriert, Sie können einfach seinen Namen anstelle von new PostType() verwenden. Und Sie können auf den router Service als $this->router in Ihrem Typ zugreifen.

+0

Können Sie den PHP-Template-Versionscode für Argumente angeben: [@router] '? –

+0

Siehe die Registerkarte PHP in [diesem Abschnitt] (http://symfony.com/doc/current/book/service_container.html#referencing-injecting-services). –

0

Sie können diese Klasse als Dienst definieren und einen Router-Dienst darin einfügen.

Weitere Informationen: Service Container.

1

Wenn Sie Ihr Formular-Builder-Klasse in einigen Controller nicht benutzen wollen, können Sie es einfacher und Ihre Form Builder gehen flexibler:

public function someAction() { 
    //... 

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

Es gibt keine Notwendigkeit, die URL in der Form Typ eingestellt Klasse. Lesen Sie hier mehr: http://symfony.com/doc/current/form/action_method.html