【问题标题】:Passing Arguments into Symfony 3 Form configureOptions将参数传递给 Symfony 3 Form configureOptions
【发布时间】:2016-12-01 12:52:10
【问题描述】:

我有以下表格:

class TestFormType extends AbstractType
{
    protected $testArgument;

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if (isset($options['testArgument'])) {
            $this->testArgument = $options['testArgument'];
        }

        $builder->add('textField', 'Symfony\Component\Form\Extension\Core\Type\TextType');
    }

    public function configureOptions(OptionsResolver $optionsResolver)
    {
        $optionsResolver->setRequired('testArgument');

        $optionsResolver->setDefaults(
            array(
                'data_class' => get_class($this->testArgument)
            )
        );
    }
}

我正在通过表单选项(Symfony 3 修改)传递 testArgument 属性的值,但是当获取属性的类名以在 configureOptions 方法中设置 'data_class' 时,它总是null。基本上我需要依赖configureOptions 方法中的表单类型类属性。有人可以帮我找到正确的方向吗?

【问题讨论】:

  • 根据 php doc get_class 返回以 object 为实例的类的名称。如果 object 不是对象,则返回 FALSE。如果在类中省略 object,则返回该类的名称。也许 get_class 返回 false 因为您没有将对象传递给它。
  • 很确定 configureOptions 在 buildForm 之前被调用。可能会添加一些死亡声明来确认。更重要的是,表单系统只创建一个特定类型的对象。因此,如果您计划有两个不同的这种类型的实例,每个实例都有不同的 data_class,那么它根本不起作用。
  • @MohammadZareMoghadam:它总是返回'TestFormType',因为configureOptionsbuildForm之前运行

标签: php forms symfony


【解决方案1】:

您应该将 *Type __constructor 传递给

use App\Entity\Blog;  
use Symfony\Component\Form\AbstractType;  
use Symfony\Component\OptionsResolver\OptionsResolver;

class BlogType extends AbstractType {

    private $someDependency;

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

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'empty_data' => new Blog($this->someDependency),
        ]);
    } }

【讨论】:

    【解决方案2】:

    我必须从表单工厂create 方法本身传递configureOptions 方法中的依赖项:

    $form = $this->factory->create(
                'app\TestBundle\Form\Type\TestFormType',
                $this->testArgument,
                array(
                    'data_class' => get_class($this->testArgument)
                )
            );
    

    因为它不会被表单类型中的默认设置设置,并且必须重构表单类型类,如下所示:

    class TestFormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('textField', 'Symfony\Component\Form\Extension\Core\Type\TextType');
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多