php - किसी निर्माता में एंटिटी प्रबंधक को कैसे कॉल करें?




symfony constructor (4)

मैं एक निर्माता में Entity Manager को कॉल करने का प्रयास कर रहा हूं:

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

लेकिन, जैसा कि मैंने इस उत्तर में देखा है: स्टैकहोवरफ्लो प्रश्न , ऐसा नहीं किया जा सकता।

तो मुझे आश्चर्य है कि अगर इसे प्राप्त करने का एक तरीका है, जैसा कि मुझे इसे अक्सर कॉल करना पड़ता है, और रिपॉजिटरी मिलने के बाद कन्स्ट्रक्टर में कुछ सामान करना चाहता हूं।

संपादित करें:

मैंने @ एम ख्यालद ज्युनद के जवाब की कोशिश की है:

//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)

नया प्रयास:

मैंने @ पैक्समैटिग जवाब के साथ भी कोशिश की है:

//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.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 में अपनी सेवाओं को आयात करना चाहिए

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

फिर अपने वर्ग के निर्माता में तर्क प्रबंधक के रूप में इकाई प्रबंधक प्राप्त करें

use Doctrine\ORM\EntityManager;
Class Test {

  protected $em;

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

आशा है कि यह समझ में आता है


आपको जोड़ना होगा

use Doctrine\ORM\EntityManager;

अपने नियंत्रक में


नियंत्रक के निर्माता में आप सिद्धांत 2 एंटिटाइनेजर को क्यों पकड़ना चाहते हैं?

क्यों नहीं केवल $em = $this->getDoctrine()->getManager(); (या $em = $this->getDoctrine()->getEntityManager(); Symfony 2.0 में) कार्रवाई (एस) में आपको इसकी आवश्यकता है? यह आपको 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 }

मुझे लगता है कि आप सही दिशा में हैं, मैं दूसरा विकल्प लेता हूं:

दूसरे विकल्प के लिए मुझे लगता है कि routing.yml में परिभाषा गलत है

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

यहां सिर्फ एमसीडीहोम बंडल को डिफॉल्ट के भीतर _ नियंत्रक से निकालें

पहला विकल्प के लिए:

क्या होमकंट्रोलर का अपना कन्स्ट्रक्टर है?

//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();




entitymanager