如何在Symfony2中的非控制器类中解析路径

7

我有一个表单构建器类,继承自AbstractType,我需要解析这样的路径:

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

由于这个类不是Controller的子类,我无法访问路由器。有什么想法吗?

那么,在构建时将路由器传递给该类怎么样?

3个回答

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()。并且你可以在你的类型中使用$this->router来访问router服务。


你能为 arguments: [ @router ] 指定 PHP 模板版本代码吗? - code-jaff
请查看此部分中的PHP选项卡。 - Elnur Abdurrakhimov

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


0
你可以将这个类定义为一个服务,并将路由器服务注入其中。
更多信息:服务容器

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接