2012-03-26 16 views
7

Tôi có một lớp người xây dựng hình thức mà kế thừa từ AbstractType và tôi cần phải giải quyết một con đường như thế này:Làm thế nào để giải quyết một con đường trong một lớp điều khiển phi trong symfony2

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

Kể từ khi lớp học không phải là con của Controller Tôi không có quyền truy cập vào bộ định tuyến. Bất kỳ ý tưởng?

Điều gì về việc chuyển bộ định tuyến đến lớp vào thời gian xây dựng?

Trả lời

16

Bạn có thể chuyển dịch vụ router qua hàm tạo cho loại biểu mẫu của bạn. Đăng ký biểu mẫu của bạn dưới dạng dịch vụ với thẻ form.type và tiêm dịch vụ router vào đó.

<?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'; 
    } 

    // ... 
} 

đăng ký nó như là một dịch vụ:

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

Và sử dụng nó trong điều khiển của bạn như thế này:

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

    // ... 
} 

Vì bạn đã đăng ký loại hình thức của bạn như một dịch vụ với thẻ form.type, bạn chỉ có thể sử dụng tên của nó thay vì new PostType(). Và bạn có thể truy cập dịch vụ router dưới dạng $this->router trong loại của bạn.

+0

Bạn có thể chỉ định mã phiên bản mẫu php cho 'arguments: [@router]'? –

+0

Xem tab PHP trong [phần này] (http://symfony.com/doc/current/book/service_container.html#referencing-injecting-services). –

0

Bạn có thể xác định lớp này là dịch vụ và đưa dịch vụ bộ định tuyến vào đó.

Thông tin thêm: Service Container.

1

Nếu bạn sẽ sử dụng lớp người xây dựng hình thức của bạn trong một số điều khiển, bạn có thể làm điều đó đơn giản hơn và xây dựng hình thức của bạn sẽ linh hoạt hơn:

public function someAction() { 
    //... 

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

Không cần để thiết lập các URL trong các loại hình thức lớp học. Đọc thêm tại đây: http://symfony.com/doc/current/form/action_method.html

Các vấn đề liên quan