Db \ Adapterのファクトリを使用するために、コントローラでServiceManagerインスタンスを取得しようとしています。zend framework 3のコントローラでサービスマネージャインスタンスを取得するには?
のI /アプリケーション/設定/ module.config.phpをモジュールに追加:
'service_manager' => [
'factories' => [
Adapter::class => AdapterServiceFactory::class,
],
],
設定/オートロード/ local.phpファイルに私は次の行を追加しました:今
'db' => [
'driver' => 'Mysqli',
'database' => 'mydb',
'username' => 'myuser',
'password' => 'mypassword',
]
アンを私のモジュール/ Application/src/Controller/IndexController.phpのServiceManagerにアクセスしたいと思っています。それ、どうやったら出来るの?
私は$sm = $this->getPluginManager();
を試しましたが、成功しませんでした。私はPluginManagerで$serviceManager->get(Adapter::class)
を実行した場合、それは私にエラーを与える:
Too few arguments to function Zend\Db\Adapter\Adapter::__construct(), 0 passed in (...)\vendor\zendframework\zend-servicemanager\src\Factory\InvokableFactory.php on line 30 and at least 1 expected
は、私は私のそのアダプタオブジェクトを取得しますServiceManagerを取得するには、何ができますか?
私はまたmodule.config.phpにgetServiceConfig()メソッドを追加し、IndexControllerにコンストラクタを加え
'controllers' => [
'factories' => [
Controller\IndexController::class => InvokableFactory::class,
],
],
から
'controllers' => [
'factories' => [
Controller\IndexController::class => function(ContainerInterface $serviceManager) {
return new Controller\IndexController($serviceManager);
},
],
],
にコントローラファクトリを変更これはServiceManagerを受け取ります。今私はコントローラの中にアクセスしている。
私の質問は今です:これを達成するために、より良い、 "似ている"方法が良いですか?
このリンクは良い答えを与え、正しい方法です。サイドノート:あなたは完全なサービスマネージャを注入したくありません。それはあなたのコントローラをuntestableにします。この例でわかるように、EntityManagerのみがコントローラに注入されています。 – xtreamwayz
ありがとうございます。私はちょうどテストのためにそれをしました。今は別のクラスでは分離されています。 – Ctwx
ZF3では、すべてのサービスを注入する必要があります。フォームに直接アクセスすることはできません。 Ex。コントローラでは 'new Form();'を使うことはできません。 –