目前,这就是我将容器注入表单的方式(通过将其作为服务):
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()调用后使其成为服务?
答案 0 :(得分:0)
这就是我在FormType中所做的:
$data = Class::getYourData();
因为我不想(像你一样)修改每个控制器以为表单设置额外的参数..