コントローラーがあります
_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']
_
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();
}
}
私はそれが古い投稿であることを知っていますが、誰かがこれに苦労している場合に備えて、使用法にタイプミスがあります:
use Doctrine\ORM\EntityManagerInterface: //<- see that's a colon, not a semicolon
ヤリマダムに同意します。サービスコンテナ、依存関係の注入、自動配線は、メソッドへの注入に関する話ではありません。 「サービス」と呼んでいるオブジェクトに注入された依存関係。
アプリケーションが起動すると、サービスコンテナが構築され、クラスコンストラクターまたは「set」メソッドの呼び出しによって1つのサービスが別のサービスに注入されます。
きみの ExampleController::someFunction
はユーザーのみが呼び出すことを目的としているため、このメソッドが受け取る方法は$injectedService
は引数として、明らかにそれを渡すということです。これは間違った方法です。
自動配線を備えた古典的な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;
}
}