web-dev-qa-db-ja.com

コンストラクターでエンティティマネージャーを呼び出す方法は?

コンストラクターでEntity Managerを呼び出そうとしています。

function __construct()
{
    $this->getDoctrine()->getEntityManager();
    ...

しかし、私がこの答えで見たように: Stackoverflowの質問 、それはできません。

それで、私はそれを頻繁に呼び出さなければならず、リポジトリを取得した後にコンストラクタでいくつかのことをしたいので、それを達成する方法があるかどうか疑問に思います。

編集:

私は@MKhalidJunaidの答えで試しました:

//src/MSD/HomeBundle/Resources/config/services.yml
services:
  imageTransController.custom.service:
    class:  MSD\HomeBundle\Controller\ImageTransController
    arguments: 
        EntityManager: "@doctrine.orm.entity_manager"

-

//app/config/config.php
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: doctrine_extensions.yml }
- { resource: "@MSDHomeBundle/Resources/config/services.yml" }

-

//src/MSD/HomeBundle/Controller/ImageTransController.php
namespace MSD\HomeBundle\Controller;

use Doctrine\ORM\EntityManager;
use MSD\HomeBundle\Entity\Imagen as Imagen;
use MSD\HomeBundle\Controller\HomeController as HomeController;


class ImageTransController extends HomeController
{
    protected $em ;

    function __construct(EntityManager $entityManager)
    {
    ...

しかし、私はこのエラーが発生しています:

Catchable Fatal Error: Catchable Fatal Error: Argument 1 passed to MSD\HomeBundle\Controller\ImageTransController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/manolo/MiServer/itransformer/app/cache/dev/jms_diextra/controller_injectors/MSDHomeBundleControllerImageTransController.php on line 13 and defined in /home/manolo/MiServer/itransformer/src/MSD/HomeBundle/Controller/ImageTransController.php line 38 (500 Internal Server Error)

新しい試み:

私も@praxmatigの答えで試しました:

//services.yml
parameters:
 msd.controller.imagetrans.class: MSD\HomeBundle\Controller\ImageTransController

services:
  msd.imagetrans.controller:
    class:  "%msd.controller.imagetrans.class%"
    arguments: [ @doctrine.orm.entity_manager  ]

-

//ImageTransController.php
namespace MSD\HomeBundle\Controller;

 use Doctrine\ORM\EntityManager;

class ImageTransController 
 {
    protected $em ;

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

-

//routing.yml
msd_home_cambiardimensiones:
    pattern: /cambiardimensiones
    defaults: { _controller: MSDHomeBundle:msd.imagetrans.controller:cambiardimensionesAction }

しかし、私はこのエラーを受け取ります:

 Unable to find controller "MSDHomeBundle:msd.imagetrans.controller" - class "MSD\HomeBundle\Controller\msd.imagetrans.controllerController" does not exist. (500 Internal Server Error)
12
Manolo

クラスのサービスを作成し、doctrineエンティティマネージャーを引数doctrine.orm.entity_manager。Likeinservices.ymlとして渡す必要があります

services:
  test.cutom.service:
    class:  Test\YourBundleName\Yourfoldernameinbundle\Test
    #arguments:
    arguments: [ @doctrine.orm.entity_manager  ] 
        #entityManager: "@doctrine.orm.entity_manager"

Services.ymlをconfig.ymlにインポートする必要があります

imports:
    - { resource: "@TestYourBundleName/Resources/config/services.yml" }

次に、クラスのコンストラクターでエンティティマネージャーを引数として取得します

use Doctrine\ORM\EntityManager;
Class Test {

  protected $em;

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

これが理にかなっていることを願っています

13
M Khalid Junaid

コントローラをサービスとして登録するときは、基本コントローラクラスを拡張しないでください。それについてのドキュメントがあります ここ

class ImageTestController
{
     private $em;

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

     public function someAction()
     {
         // do something with $this->em
     }
}

// services.yml
services:
    acme.controller.image_test:
        class: Acme\SomeBundle\Controller\ImageTestController

// routing.yml
acme:
    path: /
    defaults: { _controller: acme.controller.image_test:someAction }
5
praxmatig

コントローラーのコンストラクターでDoctrine 2 EntityManagerを取得するのはなぜですか?

必要なアクションで$em = $this->getDoctrine()->getManager();(またはSymfony2.0では$em = $this->getDoctrine()->getEntityManager();)を単純に実行しないのはなぜですか?これにより、必要のないときにEntityManagerを初期化するオーバーヘッドを回避できます。

本当にこれを実行したい場合は、 コントローラーをサービスとして定義する方法 に関する明確な指示があります。基本的には次のようになります。

# src/MSD/HomeBundle/Controller/ImageTransController.php

namespace MSD\HomeBundle\Controller;

use Doctrine\ORM\EntityManager;

class ImageTransController
{
    private $em;

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

    public function indexAction()
    {
        // use $this->em
    }
}


# src/MSD/HomeBundle/Resources/config/services.yml

parameters:
    msd.controller.image_trans.class: MSD\HomeBundle\Controller\ImageTransController

services:
    msd.controller.image_trans:
        class:     "%msd.controller.image_trans.class%"
        arguments: ["@doctrine.orm.default_entity_manager"]

# app/config/routing.yml

msd_home_cambiardimensiones:
    path:         /cambiardimensiones
    defaults:     { _controller: msd.controller.image_trans:indexAction }
1

追加する必要があります

use Doctrine\ORM\EntityManager;

あなたのコントローラーで

0
Amine

コントローラーをサービスとして定義する予定がない限り、コントローラーのコンストラクターでエンティティマネージャーを取得しようとしているようですが、これはその方法ではありません。この場合、依存性注入を使用してサービスエンティティマネージャーを注入する必要があります。

ただし、一般に、コントローラーでエンティティマネージャーを使用する一般的な方法は、次のコードを使用してエンティティマネージャーを取得することです。

  $entityManager = $this->container->get('doctrine.orm.entity_manager');
0
shacharsol

私はあなたが正しい方向にいると思います、私は2番目のオプションを取ります:

2番目のオプションについては、routing.yml内の定義が間違っていると思います

//routing.yml 
msd_home_cambiardimensiones:
    pattern: /cambiardimensiones
    defaults: { _controller: msd.imagetrans.controller:cambiardimensionesAction }

ここでは、デフォルト内の_controllerからMSDHomeBundleを削除するだけです。

最初のオプションの場合:

HomeControllerには独自のコンストラクターがありますか?

//src/MSD/HomeBundle/Resources/config/services.yml
services:
    imageTransController.custom.service:
        class:  MSD\HomeBundle\Controller\ImageTransController
        arguments: [@doctrine]

コンストラクター内で役立つ可能性があります

__construct(Registry $doctrine)
$this->doctrine = $doctrine;

or

$this->em = $doctrine->getManager();
0
felipep