コンストラクターで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)
クラスのサービスを作成し、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;
}
}
これが理にかなっていることを願っています
コントローラをサービスとして登録するときは、基本コントローラクラスを拡張しないでください。それについてのドキュメントがあります ここ
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 }
コントローラーのコンストラクターで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 }
追加する必要があります
use Doctrine\ORM\EntityManager;
あなたのコントローラーで
コントローラーをサービスとして定義する予定がない限り、コントローラーのコンストラクターでエンティティマネージャーを取得しようとしているようですが、これはその方法ではありません。この場合、依存性注入を使用してサービスエンティティマネージャーを注入する必要があります。
ただし、一般に、コントローラーでエンティティマネージャーを使用する一般的な方法は、次のコードを使用してエンティティマネージャーを取得することです。
$entityManager = $this->container->get('doctrine.orm.entity_manager');
私はあなたが正しい方向にいると思います、私は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();