2013-12-14 403 views
12

我一直在試圖撥打Entity Manager在構造函數中:如何在構造函數中調用實體管理器?

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

但是,正如我在這個答案已經看到:Stackoverflow question,它無法做到的。

所以我想知道是否有辦法實現它,因爲我必須經常調用它,並且想在獲取存儲庫之後在構造函數中執行一些操作。

編輯:

我試着@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) 
    { 
    ... 

,但我「M收到此錯誤:

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) 
+0

@MKhalidJunaid - 如果'EntityManager'被構造之後注入,我怎麼可能通過'EntityManager'作爲構造函數中的參數?你能發表一個詳細的答案嗎? – Manolo

+0

這是什麼依賴注入是因爲它是在構造函數調用後注入以訪問構造函數中的實體管理器,您需要創建一個服務並將其作爲參數傳遞它看到我的答案,它會給你一個想法 –

回答

11

你需要做的服務,爲您的類並把學說實體管理器作爲參數doctrine.orm.entity_manager。就像在services.yml

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

你必須在config.yml中導入你的services.yml

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

然後在你的類的構造uctor得到實體管理器作爲參數

use Doctrine\ORM\EntityManager; 
Class Test { 

    protected $em; 

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

希望這是有道理

+1

是的,它的確如此。讓我明天嘗試回答。感謝您參觀詳細的答案。 – Manolo

+0

好吧,如果我喜歡你說我得到這個錯誤:'可捕獲的致命錯誤:參數1傳遞給MSD \ HomeBundle \ Controller \ ImageTransController :: __ construct()必須是MSD \ HomeBundle \ Controller \ EntityManager的實例,沒有給出被稱爲在/home/xxxx/webDir/itransformer/app/cache/dev/jms_diextra/controller_injectors/MSDHomeBundleControllerImageTransController.php上線13和在/ home/XXXX/WEBDIR/itransformer/SRC/MSD/HomeBundle /控制器/ ImageTransController定義。 PHP行37(500內部服務器錯誤)'。任何想知道剩下要做什麼? – Manolo

+1

您是否正確地將您的服務導入了config.yml中 –

0

你必須在你的控制器添加

use Doctrine\ORM\EntityManager; 

+0

我收到了同樣的錯誤。 – Manolo

4

當你註冊,不要擴展基控制器類控制器即服務。有一個關於它的here

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 } 
+0

我也遇到了同樣的錯誤。 – Manolo

+0

我已更新我的問題。你可能會發現錯字。 – Manolo

+0

@ManoloSalsas將'defaults:{_controller:MSDHomeBundle:msd.imagetrans.controller:cambiardimensionesAction}'替換爲'默認值:{_controller:msd.imagetrans.controller:cambiardimensionesAction}'。如果要將控制器用作服務,則不應指定軟件包名稱。 – praxmatig

1

文檔,你爲什麼要搶學說2的EntityManager在控制器的構造函數?

爲什麼不簡單地在您需要的操作中執行$em = $this->getDoctrine()->getManager();(或在Symfony 2.0中爲$em = $this->getDoctrine()->getEntityManager();)?這樣可以節省您在不需要時初始化EntityManager的開銷。

如果你真的想這樣做,也有對How to define Controllers as Services明確的指示。基本上,它看起來是這樣的:

# 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 } 
0

我認爲你是在正確的方向,我會採取第二個選項:

對於第二個選項,我認爲這裏面的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

我看到你試圖讓實體管理器的控制器,這是不一樣的構造這樣做,除非你計劃將你的控制器定義爲一項服務。 在這種情況下,您需要使用依賴注入來注入服務實體管理器。

但在一般使用實體管理器的控制器與常見的方式是通過簡單地得到它使用下面的代碼:

$entityManager = $this->container->get('doctrine.orm.entity_manager'); 
相關問題