我一直在使用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';
}
}
我在这里错过了这一点吗?我不应该这样做吗?我在谷歌上找不到任何有用的东西。
谢谢!
答案 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(...
生成您的网址表单类型
的作用相同