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]

コードを実行すると、次の例外が発生します。

Catchable Fatal Error: 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


おかしな見た目のクラスEntityManager50ecb6f979a07_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrin‌​e\ORM\EntityManagerは Doctrine2 プロキシ クラスです。

Symfony 2.1 から、$this->getDoctrine()->getEntityManager()lonoger を呼び出さない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 に答える