2016-04-06 88 views
0

在Symfony2中我可以打电话给Symfony3的setAction在FormType

// MyController.php 
$formType = new MyFormType($this->container); 
$form = $this->createForm($formType); 

// MyFormType.php 
protected $container; 

public function __construct(ContainerInterface $container) 
{ 
    $this->container = $container; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->setAction($this 
      ->container 
      ->get('router') 
      ->generate('myAction') 
     ); 
    // ... 
    } 
} 

在symfony3我应该通过stringcreateForm方法,所以我不能够控制或路由器通过向MyFormType

我试着将FormType定义为服务,但不会改变行为。

如何设置MyFormType(不在MyController)中的操作?

+0

显示如何将表单类型定义为服务。你应该可以在没有问题的情况下注入路由器。 – Cerad

+0

是的,我注入路由器没有问题,但在我看来,symfony创建窗体类型为“新的FormType”,根本不调用服务(当使用'createForm'方法时)。所以我在FormType中的构造函数被调用时没有任何参数。 – Eddie

+0

不是。如果您将表单类型正确定义为服务,那么createForm功能会将其从容器中拉出。仔细检查你的工作。确保您的服务定义正在使用container:debug进行加载。我保证它会起作用。 – Cerad

回答

1

第一,我发现目前唯一的选择是:

// MyController.php 
$this->createForm(MyFormType::class, null, ['router' => $this->get('router')]); 

// MyFormType.php 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->setAction($options['router']->generate('myAction')); 
    // ... 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'router' => null, 
     // ... 
    ]); 
} 

但这种方法似乎有点有点难看我。

0

你应该定义形式的服务,如:

// src/AppBundle/Form/Type/MyFormType.php 
namespace AppBundle\Form\Type; 

use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

class MyFormType extends AbstractType 
{ 
    private $router; 

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

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // You can now use myService. 
     $builder 
      ->setAction(
       $this->router->generate('myAction') 
      ) 
      ->add('myInput') 
      ->add('save', SubmitType::class) 
     ; 
    } 
} 
# app/config/services.yml 
services: 
    app.form.type.my_form_type: 
     class: AppBundle\Form\Type\MyFormType 
     arguments: [ "@router" ] 
     tags: 
      - { name: form.type } 

在您的控制器,那么你只需要调用$this->createForm(MyFormType::class);

+0

我尝试了你写的东西,我不会在这里发布所有的类,因为代码太多。在symfony2(一段时间之前),我用这种方式定义FormTypes(services.yml),它的工作,但在sf3我没有在MyFormType构造函数:( – Eddie

1

至少在Symfony2中(2.7测试),你可以这样做:

//MyController.php 
$this->createForm(MyFormType::class, null, array('action' => $this->generateUrl('my_acton_name'))); 

使用此解决方案无需修改您的FormType,选项'动作'是Symfony Forms支持的真正选项,因此无需使用路由器添加它。 你可以找到文件here

+0

它几乎与我的答案相同。不同的是,我通过路由器,而不是网址。我不想将url存储在控制器中,这不是一个好习惯。 – Eddie

+0

确实这和你几乎一样,不同的是我使用了内置的功能。两者都是可能的。 – AnthonyB