【问题标题】:How to generate absolute URL in custom form type?如何生成自定义表单类型的绝对 URL?
【发布时间】:2016-12-20 23:10:25
【问题描述】:

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

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
        ));
    }

}

如何为我的路由生成绝对 URL(如 http://example.com/admin/check_form)?

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

【问题讨论】:

  • Afaik 您可以将 URL 添加为字符串。什么都不需要生成,因为它不依赖于任何东西,它是绝对的。我假设 example.com 你的意思是你的项目之外的东西。
  • 嗯,应该是动态的,根据应用所在的当前域和目录。
  • 如果它与你的项目有关,那么它必须有一个路由和一个控制器/动作。否则生成器将不知道 this 应该指向哪里。
  • 是的,我有一个名为“check_form”的路由,现在我想在 setAction() 方法中为该路由生成 url。
  • 第三个参数这样做:$this->generateUrl('check_form', array(), true);

标签: php symfony


【解决方案1】:

有两种方法:

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

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

    请注意,您必须将true 作为最后一个参数传递,以强制路由器生成一个绝对 url(正如您要求的 Symfony UrlGeneratorInterface::ABSOLUTE_URL 而不是 Emilie 在 cmets 中建议的 true。

【讨论】:

  • 从 Symfony 2.8 开始,你必须使用 UrlGeneratorInterface::ABSOLUTE_URL 而不是 true 作为 referenceType 参数,否则你会得到一个弃用的错误
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2016-12-25
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多