如何在自定义表单类型中生成绝对URL?

时间:2014-06-27 14:48:00

标签: php symfony

我有自定义表单类型示例:

namespace Acme\SimpleBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ExampleType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->setAction(****-----GENERATE-ROUTE-ABSOLUTE-URL-HERE-----****)
                ->add('email', 'text')
                ->add('send', 'submit');
    }

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

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'error_bubbling' => true
        ));
    }

}

如何在路线中生成绝对网址(如http://example.com/admin/check_form)?

$this->generateUrl()不起作用,请原谅,它不是控制器,$this->get('router')->generate()也不起作用,我不知道为什么。

2 个答案:

答案 0 :(得分:13)

有两种方法可以做到:

  • 将您的表单类型注册为服务并将路由器注入其中:doc
  • 在控制器中创建表单时,将操作作为选项传递:

     $form = $this->createForm(new FormType(), null, array('action' => $this->generateUrl('your_route', array(/* your route parameters */), true));
    

    请注意,您必须将true作为最后一个参数传递,以强制路由器生成绝对URL(正如您要求的Symfony< 2.8)。如果您使用的是Symfony3,请在评论中使用UrlGeneratorInterface::ABSOLUTE_URL而不是Emilie建议的真实。

答案 1 :(得分:5)

您必须将FormType声明为服务,并使用服务容器添加路由器(服务ID:路由器),然后在您的FormType中:

$this->router->generate('your_route_name', [] /* params */, true /* absolute */);

这里是文档:http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html