不在控制器中时如何生成URL

时间:2013-11-06 15:28:39

标签: forms symfony symfony-2.3

我一直在使用Symfony2(.3)开发一个系统并遇到了一个问题......我正在尝试构建一个应该发布到/register的表单类。我怎样才能做相同的

$url = $this->generateUrl('register');$this->get('router')->generate('register');

在扩展AbstractType的类中?代码如下。

class RegistrationFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);

        $builder->setAction(/*I want the URL generated here*/)
                ->add('username', 'string')
                ->add('password', 'repeated', array(

                ))
                ->add('cellphone', 'text', array(
                    'max_length' => 10,
                    'invalid_message' => 'A phone number must be exactly 10 characters long',
                ));

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\MainBundle\Entity\SystemUser',
        ));
    }

    public function getName() {
        return 'user_registration';
    }
} 

我在这里错过了这一点吗?我不应该这样做吗?我在谷歌上找不到任何有用的东西。

谢谢!

2 个答案:

答案 0 :(得分:3)

您需要将router服务注入RegistrationFormType

将此添加到您的类型

use Symfony\Bundle\FrameworkBundle\Routing\Router;

class RegistrationFormType extends AbstractType
{    
    private $router;

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

然后,如果您已将类型定义为服务,则应按以下方式构建它(通过提供@router服务作为构造函数的参数),

services:
    form.type.user_registration:
        class: path_to_your_type/RegistrationFormType
        arguments: [ @router ]
        tags:
            - { name: form.type }

然后,您可以通过调用

访问类型中的router's generate helper
$this->router->generate('register');

,为了通过Dependency Injection Container构建您的类型,您必须使用,

$form = $this->createForm('user_registration', $systemUserInstance);

代替,

$form = $this->createForm(new RegistrationFormType(), $systemUserInstance);

答案 1 :(得分:1)

如果您正在使用服务,或表单类型作为服务,则可以将路由器作为参数传递

acme.my_service:
    class: %acme.my_service.class%
    arguments: [ @router ]

然后将其添加到构造函数

use Symfony\Component\Routing\Router;

class MyService
{
    protected $router;

    public function __construct(Router $router)
    {
        $this->router = $router;
    }
...
}

然后您可以使用$ this-> router-> generateUrl(...

生成您的网址

表单类型

的作用相同