1

/编辑/

我有这堂课:

namespace Baza\BlogBundle\Form;   
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityManager; 

class filterType extends AbstractType
{

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

   $this->$em->getDoctrine()->getEntityManager();

   /****
   ****/

 }
}

这是我的服务 yml:

services:
 filterType:
    class: Baza\BlogBundle\Form\filterType
    arguments: [doctrine.orm.entity_manager]

当我运行代码时,出现以下异常:

可捕获的致命错误:传递给 Baza\BlogBu​​ndle\Form\filterType::__construct() 的参数 1 必须是 Doctrine\ORM\EntityManager 的实例,没有给出

我完全没主意了。

4

2 回答 2

3

我自己创建了 FormType。这应该有效:

<?php
// Baza\BlogBundle\Form\filterType.php

namespace Baza\BlogBundle\Form;  

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Doctrine\ORM\EntityManager;

class filterType extends AbstractType
{
  protected $em;

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

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    // Do something with your Entity Manager using "$this->em"
  }

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

在你的控制器中使用类似的东西

<?php
// Baza\BlogBundle\Controller\PageController.php

namespace Baza\BlogBundle\Controller;
use Baza\BlogBundle\Form\filterType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class BaseController extends Controller
{
     public function testEntityManager()
     {
         // assign whatever you need
         $enquiry = null;
         // getEntityManager() is depricated. Use getManager() instead.
         $em = $this->getDoctrine()->getManager();

         $this->createForm(
             new filterType($em),
             $enquiry
         );
     } 
}

永远不要忘记包含/使用您正在使用的所有类。否则 PHP 将假定该类在您当前使用的命名空间内。

这就是你得到错误的原因(在 Cerad 的帖子上)

Catchable Fatal Error: Argument 1 passed to
Baza\BlogBundle\Form\filterType::__construct()
must be an instance of Baza\BlogBundle\Form\EntityManager [...]

由于您没有包含 EntityManager,PHP 假设它是您当前命名空间中的一个类,即Baza\BlogBundle\Form.


看起来很有趣的 ClassEntityManager50ecb6f979a07_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrin‌​e\ORM\EntityManager是一个 Doctrine2 代理类。

从 Symfony 2.1 开始,调用$this->getDoctrine()->getEntityManager()no longer 会产生Doctrine\ORM\EntityManager一个代理类,它的行为实际上与原始类一样EntityManager,可以毫无问题地传递。

于 2013-01-09T16:33:05.293 回答
1

需要 @ 符号来指示参数是服务。但是,正如您所发现的,@ 会使 yaml 解析器出错。解决方案是使用引号。

services:
    filterType:
        class: Baza\BlogBundle\Form\filterType
        arguments: ['@doctrine.orm.entity_manager']

我记得我也花了几个小时才弄清楚这一点。

于 2013-01-09T14:46:18.560 回答