Symfony2在FormType中注入EntityMananager

时间:2014-04-18 13:28:08

标签: symfony entitymanager

自定义表单类型     

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityManager;

class NationaliteitidType extends AbstractType 
{
private $doctrine;
private $em;

public function __construct(EntityManager  $em)
{
    $this->em = $em;
}

service.yml     服务:

fw_core.form.type:
    class: FW\CoreBundle\Form\Type\NationaliteitidType
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"

错误:

  

传递给FW \ CoreBundle \ Form \ TypeNationaliteitidType :: __ construct()的参数1必须是Doctrine \ ORM \ EntityManager的实例,没有给出,

我必须做出类型或其他明显的东西,但真的找不到它。

4 个答案:

答案 0 :(得分:2)

在您的services.yml中,您无法为未来的变量命名,请尝试以下操作:

services :
    fw_core.form.type:
        class: FW\CoreBundle\Form\Type\NationaliteitidType
        arguments: 
            - "@doctrine.orm.entity_manager"

答案 1 :(得分:0)

我认为(对于服务容器没有太多帮助,所以请耐心等待)你必须做以下事情(已经由@Touki建议):

services.yml:

fw_core.form.type:
    class: FW\CoreBundle\Form\Type\NationaliteitidType
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"

在你的班上:

public function __construct($entityManager)
{
    $this->em = $entityManager;
}

您可以看到,__ construct参数(本例中为entityManager)必须与services.yml中冒号前的名称相同。

修改:您可能还需要对代码执行某些操作,请参阅此处:http://symfony.com/doc/current/book/service_container.html

答案 2 :(得分:0)

为什么需要注入实体经理?如果你想根据从db检索到的一些信息来填充一个字段,你应该简单地做一些像

这样的事情
$qb_function = function(EntityRepository $rep) use ($bar_parameter) {
    return $rep->createQueryBuilder('s')
               ->where('s.bar = :bar')
               ->setParameter('bar',$bar_parameter);};
}
$builder->add('foo','entity',array('query_builder')=>qb_function);

答案 3 :(得分:0)

在控制器中 使用PrintelBundle \ Form \ XXXType;

class XXXController extends Controller
{
....
    public function newAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();

        $entity = new XXX();
        $form = $this->createForm(new XXXType($em), $entity);

...

并在formType

class XXXType extends AbstractType
{
    private $em;

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

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $em = $this->em;

........ 完成