如何在不破坏CRUD相关操作的情况下将容器正确注入表单文件?

时间:2012-02-17 18:06:43

标签: symfony

目前,这就是我将容器注入表单的方式(通过将其作为服务):

ApFloorType.php     

namespace Techforge\ApartmentBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;


class ApFloorType extends AbstractType
{

    //in the controller, they are differently initialised
    private $container;

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


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

        $bath_choices = $this->container->getParameter('bath_choices');
        $bed_choices = $this->container->getParameter('bed_choices');

        $builder
            ->add('baths', 'choice', array('choices' => $bath_choices))
            ->add('beds', 'choice', array('choices' => $bed_choices))
            ->add('name')
            ->add('file')
            ->add('plan_description', 'textarea')
            ->add('min_max_feet', 'text')
            ->add('deposit', 'text')
            ->add('application_fee')
            ->add('rental_deposit')
            ->add('lease_terms', 'textarea')
            ->add('threshhold_value')
            ->add('auto_accept')
            ->add('pending')
            ->add('apartment', 'hidden', array('property_path' => false))
            ->add('pre_post_update', 'hidden')
            ->add('photos', 'collection', array('type' => new ApFloorImageType()))

        ;
    }

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

问题是ApFloor CRUD系统在此之后停止工作,因为在我的控制器中,我不能只写

$form   = $this->createForm(new ApFloorType(), $floor);

这会产生以下错误:

  

捕获致命错误:参数1传递给   Techforge \ ApartmentBundle \ Form \ ApFloorType :: __ construct()必须   实现接口   Symfony \ Component \ DependencyInjection \ ContainerInterface,没有给出,   呼唤   /home/stormlifter/webapps/pmr/src/Techforge/ApartmentBundle/Controller/Manager/ApFloorController.php   在第38行并在中定义   /home/stormlifter/webapps/pmr/src/Techforge/ApartmentBundle/Form/ApFloorType.php   第16行

我通过调用这样的表单创建方法解决了这个问题;

$form   = $this->createForm($this->get('apfloortype'), $floor);

所以我的问题是,是否有一个解决方法,所以我不必在我的CRUD控制器中更改每个createForm()调用后使其成为服务?

1 个答案:

答案 0 :(得分:0)

这就是我在FormType中所做的:

$data = Class::getYourData();

因为我不想(像你一样)修改每个控制器以为表单设置额外的参数..