web-dev-qa-db-ja.com

Zend Framework 2のモジュール構成へのアクセス

コントローラーからモジュール構成にアクセスするにはどうすればよいですか?

37
Dmitry

私はまったく同じ問題を抱えていて、決定的な答えを見つけることができなかったので、これがどれほど曖昧であるかに本当に驚いています。 ZF2のドキュメントはこれについて何かを言うと思うでしょう。とにかく、試行錯誤を使用して、私はこれに遭遇しましたextremely simple answer:

内部コントローラー機能:

$config = $this->getServiceLocator()->get('Config');

内部モジュールクラス関数(Module.phpファイル):

$config = $e->getApplication()->getServiceManager()->get('Config');

$eZend\Mvc\MvcEventのインスタンスです


一般に、構成配列はConfigという名前のサービスとして登録されているため、グローバルサービスマネージャーにアクセスできる場所であればどこからでも構成にアクセスできます。 (大文字のC。に注意)

これは、application.config.php(グローバルおよびローカル)とmodule.config.phpの和集合の配列を返します。その後、必要に応じて配列要素にアクセスできます。

OPは今ではかなり古くなっていますが、これで誰かがこの答えにたどり着くまでに1時間以上も節約できることを願っています。

92
tomo

モジュール構成を使用してコントローラーで正確に何をしたいですか?代わりに、DIコンテナーに完全に構​​成されたオブジェクトをコントローラーに注入させることではできないことですか?

たとえば、 Rob AllenのZend Framework 2入門 は、設定済みのZend\Db\Tableインスタンスをコントローラーに注入するこの例を示します。

return array(
'di' => array(
    'instance' => array(
        'alias' => array(
            'album' => 'Album\Controller\AlbumController',
        ),
        'Album\Controller\AlbumController' => array(
            'parameters' => array(
                'albumTable' => 'Album\Model\AlbumTable',
            ),
        ),
        'Album\Model\AlbumTable' => array(
            'parameters' => array(
                'config' => 'Zend\Db\Adapter\Mysqli',
        )),
        'Zend\Db\Adapter\Mysqli' => array(
            'parameters' => array(
                'config' => array(
                    'Host' => 'localhost',
                    'username' => 'rob',
                    'password' => '123456',
                    'dbname' => 'zf2tutorial',
                ),
            ),
        ),
        ...

アプリケーションが完全にブートストラップされた後に追加の初期化を行う必要がある場合は、モジュールクラスのbootstrapイベントにinitメソッドをアタッチできます。A Matthew Weierによるブログ投稿O'Phinney は次の例を示します。

use Zend\EventManager\StaticEventManager,
Zend\Module\Manager as ModuleManager

class Module
{
    public function init(ModuleManager $manager)
    {
        $events = StaticEventManager::getInstance();
        $events->attach('bootstrap', 'bootstrap', array($this, 'doMoarInit'));
    }

    public function doMoarInit($e)
    {
        $application = $e->getParam('application');
        $modules     = $e->getParam('modules');

        $locator = $application->getLocator();
        $router  = $application->getRouter();
        $config  = $modules->getMergedConfig();

        // do something with the above!
    }
}

これらのアプローチのいずれかがトリックを行いますか?

7
Jason Grimes

beta5の場合、Module.phpにこのような関数を追加できます

public function init(ModuleManager $moduleManager)
{ 
    $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
    $sharedEvents->attach(__NAMESPACE__, 'dispatch', function($e) {
          $config = $e->getApplication()->getConfiguration();
          $controller = $e->getTarget();
          $controller->config = $config;
    });
 }

コントローラでは、設定を取得できます:

print_r($this->config); 
3
samsonasik

モジュールのみの設定を読み取るには、モジュールはLocatorRegisteredInterfaceを実装するだけです

前:

namespace Application;

class Module
{
   // ...
}

後:

namespace Application;

use Zend\ModuleManager\Feature\LocatorRegisteredInterface;

class Module implements LocatorRegisteredInterface
{
   // ...
}

その実装では、LocatorRegistrationListenerがサービスロケーターのモジュールのインスタンスをnamespace\Moduleとして保存するように指示しています

次に、モジュールにアクセスできる場所ならどこでも:

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        /** @var \Application\Module $module */
        $module = $this->getServiceLocator()->get('Application\Module');
        $moduleOnlyConfig = $module->getConfig();

        // ...
    }
} 
3
Filipp Qoma

pull request ready があります。これは、DIコンテナーからモジュールクラス(したがって、modules/foo/Module.php _Foo\Module_クラス)をプルします。これにはいくつかの利点がありますが、_Zend\Di\Locator_にアクセスできる場合は、そのモジュールインスタンスをもう一度取得することもできます。

アクションコントローラーが_Zend\Mvc\Controller\ActionController_を拡張する場合、コントローラーはLocatorAwareです。つまり、インスタンス化の際に、コントローラーにはモジュールを知っているロケーターが挿入されます。そのため、コントローラーのDICからモジュールクラスをプルできます。これで、モジュールが設定ファイルを使用してモジュールクラスインスタンス内に保存すると、ロケーターを使用して任意のクラスからその設定データにアクセスするゲッターを作成できます。あなたはおそらくあなたのモジュールFoo\Module::getConfig()で既にアクセサーを持っています

ZF2は大いに開発中であり、おそらくこのコードは後で変更される可能性がありますが、この機能は現在、 このテスト でカバーされており、これが最も重要な部分です。

_$sharedInstance = $locator->instanceManager()->getSharedInstance('ListenerTestModule\Module');

$this->assertInstanceOf('ListenerTestModule\Module', $sharedInstance);
_

したがって、モジュールクラス_$sharedInstance_を使用すると、そこから設定にアクセスできます。すぐにこの機能の省略形を期待していますが、これはPR#786がZF2マスターにマージされた後にのみ行うことができます。

1
Jurian Sluiman

モデルからServiceLocatorAwareInterfaceを実装する必要があります。そして、setServiceLocator()およびgetServiceLocator()を設定すると、サービスマネージャーに直接アクセスできます。このコードサンプルをご覧ください https://Gist.github.com/ppeiris/7308289

1
ppeiris

このハック/トリックにより、どこからでも設定値にアクセスできます

$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);

コントローラーとビューの設定を読み取るためのコントローラープラグインとビューヘルパーを使用してモジュールを作成しました。 GitHubリンク __ 作曲者リンク

composer経由でインストールする

composer require tasmaniski/zf2-config-helper

新しいモジュール「ConfigHelper」をconfig/application.config.phpファイル

'modules' => array(
    '...',
    'ConfigHelper'
),

コントローラで使用し、ファイルを表示します

echo $this->configHelp('key_from_config'); // read specific key from config 

$config = $this->configHelp(); // return config object Zend\Config\Config
echo $config->key_from_config;
0
tasmaniski