2017-03-04 7 views
2

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を受け取ります。今私はコントローラの中にアクセスしている。

私の質問は今です:これを達成するために、より良い、 "似ている"方法が良いですか?

答えて

4

SOの素晴らしい関連トピックのおかげで、私はついにその答えを見つけました。 ServiceManager in ZF3

コントローラファクトリを使用しているように思えます。

+2

このリンクは良い答えを与え、正しい方法です。サイドノート:あなたは完全なサービスマネージャを注入したくありません。それはあなたのコントローラをuntestableにします。この例でわかるように、EntityManagerのみがコントローラに注入されています。 – xtreamwayz

+0

ありがとうございます。私はちょうどテストのためにそれをしました。今は別のクラスでは分離されています。 – Ctwx

+0

ZF3では、すべてのサービスを注入する必要があります。フォームに直接アクセスすることはできません。 Ex。コントローラでは 'new Form();'を使うことはできません。 –

0

私はZF1に慣れていて、今はZF3を学んでいます。私は簡単なことをしたいと思っていました。構成ファイルでDB構成を設定してから、コントローラでdbアダプタを取得します。公式文書にはさまざまなカスタマイズのための何百万ものオプションがあるので、それを理解するのはしばらく時間がかかりました。だから私は誰も探して私の答えを投稿しています。

の1-このように、config/autoload/global.phpまたはconfig/autoload/local.phpでDB資格情報を追加します。で、最後に

return [ 
    //... 
    'controllers' => [ 
     'factories' => [ 
      //... 
      // Add these lines 
      Controller\MycontrollernameController::class => function($container) {// $container is actually the service manager 
       return new Controller\MycontrollernameController(
        $container->get(\Zend\Db\Adapter\Adapter::class) 
       );// this will pass the db adapter to the controller's constructor 
      }, 
      //... 
     ] 
    ] 
    //... 
]; 

、3-:module/YOUR_MODULE_NAME/config/module.config.php

<?php 
return [ 
    'db' => [ 
     'driver' => 'Pdo_Mysql',// can be "Mysqli" or "Pdo_Mysql" or other, refer to this link for the full list: https://docs.zendframework.com/zend-db/adapter/ 
     'hostname' => 'localhost',// optional 
     'database' => 'my_test_db', 
     'username' => 'root', 
     'password' => 'root', 
    ], 
]; 

2-、コントローラ工場のセクションの下に以下を追加あなたのコントローラmodule/YOUR_MODULE_NAME/src/Controller/MycontrollernameControllerを入手して使用することができます:

<?php 
namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

use Zend\Db\Adapter\Adapter; 

class MycontrollernameController extends AbstractActionController 
{ 

    private $db; 

    public function __construct($db) 
    { 
     $this->db = $db; 
    } 

    public function indexAction() 
    { 
     $result = $this->db->query('SELECT * FROM `my_table`', Adapter::QUERY_MODE_EXECUTE); 
     echo $result->count();// output total result 
     return new ViewModel(); 
    } 
} 

コントローラのファクトリを作成して同じことを達成するもう1つの方法があり、そのファクトリの中にdbアダプタをコントローラに渡します。私のような世界レベルでZF3を試してみる初心者のためには、それはあまりにも多いと思います。

関連する問題