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




symfony constructor (5)

मैं एक निर्माता में 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)

जब आप नियंत्रक को सेवा के रूप में पंजीकृत करते हैं, तो बेस नियंत्रक वर्ग का विस्तार न करें। इसके बारे में एक दस्तावेज यहाँ है

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.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 }

मैं देखता हूं कि आप नियंत्रक के निर्माता में इकाई प्रबंधक को प्राप्त करने का प्रयास कर रहे हैं, जो ऐसा करने का तरीका नहीं है, जब तक कि आप अपने नियंत्रक को सेवा के रूप में परिभाषित करने की योजना न करें। जो इस मामले पर आपको सेवा इकाई प्रबंधक को इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग करना होगा।

लेकिन सामान्य तौर पर एक नियंत्रक में इकाई प्रबंधक का उपयोग करने का सामान्य तरीका यह केवल निम्न कोड का उपयोग करके प्राप्त होता है:

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




entitymanager