web-dev-qa-db-ja.com

Symfony 4サービスにDoctrine Entity Managerを挿入する方法

コントローラーがあります

_use Doctrine\ORM\EntityManagerInterface:
class ExampleController{
   public function someFunction(ExampleService $injectedService){
       $injectedService->serviceFunction();
    }
}
_

サービスあり

_use Doctrine\ORM\EntityManagerInterface;
class ExampleService{
    public function __construct(EntityManagerInterface $em){
        ...
    }    
}
_

ただし、someFunction()への呼び出しは、0個のパラメーターが渡されたために失敗します(EntityManagerInterfaceは挿入されていません)。サービスからEntityManagerを使用しようとしています。自動配線がオンになっています。 Symfony3のソリューションを試しましたが、何か不足している場合を除き、動作しないようです。

編集:ここに私のservices.yamlがあります:

_services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false 

    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']
_
5
BLaZuRE

Symfony 4でのみ使用します。

use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Name; //if you use entity for example Name

class ExampleService{
    private $em;
    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    function newName($code) // for example with a entity
    {
        $name = new Name();
        $name->setCode($code); // use setter for entity

        $this->em->persist($name);
        $this->em->flush();
    }
}
8

私はそれが古い投稿であることを知っていますが、誰かがこれに苦労している場合に備えて、使用法にタイプミスがあります:

use Doctrine\ORM\EntityManagerInterface: //<- see that's a colon, not a semicolon
3
K. Weber

ヤリマダムに同意します。サービスコンテナ、依存関係の注入、自動配線は、メソッドへの注入に関する話ではありません。 「サービス」と呼んでいるオブジェクトに注入された依存関係。

アプリケーションが起動すると、サービスコンテナが構築され、クラスコンストラクターまたは「set」メソッドの呼び出しによって1つのサービスが別のサービスに注入されます。

きみの ExampleController::someFunctionはユーザーのみが呼び出すことを目的としているため、このメソッドが受け取る方法は$injectedServiceは引数として、明らかにそれを渡すということです。これは間違った方法です。

2
Murat Erkenov

自動配線を備えた古典的なsymfonyサービスは、コンストラクター注入メソッドを使用して依存関係を注入します。あなたの場合、コンストラクタはありません。

コンストラクターメソッドを追加し、プライベートクラスプロパティに依存関係を設定することを検討できます。それに応じて使用します。

または、 setter injection を利用できます。

サービス構成:

services:
 app.example_controller:
     class: Your\Namespace\ExampleController
     calls:
         - [setExampleService, ['@exampleService']]

コントローラークラス:

class ExampleController
{
    private $exampleService;

    public function someFunction() {
        $this->exampleService->serviceFunction();
    }

    public function setExampleService(ExampleService $exampleService) {
        $this->exampleService = $exampleService;
    }
}
1
Yarimadam