コントローラーからモジュール構成にアクセスするにはどうすればよいですか?
私はまったく同じ問題を抱えていて、決定的な答えを見つけることができなかったので、これがどれほど曖昧であるかに本当に驚いています。 ZF2のドキュメントはこれについて何かを言うと思うでしょう。とにかく、試行錯誤を使用して、私はこれに遭遇しましたextremely simple answer:
$config = $this->getServiceLocator()->get('Config');
Module.php
ファイル):$config = $e->getApplication()->getServiceManager()->get('Config');
$e
はZend\Mvc\MvcEvent
のインスタンスです
一般に、構成配列はConfig
という名前のサービスとして登録されているため、グローバルサービスマネージャーにアクセスできる場所であればどこからでも構成にアクセスできます。 (大文字のC
。に注意)
これは、application.config.php(グローバルおよびローカル)とmodule.config.phpの和集合の配列を返します。その後、必要に応じて配列要素にアクセスできます。
OPは今ではかなり古くなっていますが、これで誰かがこの答えにたどり着くまでに1時間以上も節約できることを願っています。
モジュール構成を使用してコントローラーで正確に何をしたいですか?代わりに、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!
}
}
これらのアプローチのいずれかがトリックを行いますか?
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);
モジュールのみの設定を読み取るには、モジュールは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();
// ...
}
}
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マスターにマージされた後にのみ行うことができます。
モデルからServiceLocatorAwareInterfaceを実装する必要があります。そして、setServiceLocator()およびgetServiceLocator()を設定すると、サービスマネージャーに直接アクセスできます。このコードサンプルをご覧ください https://Gist.github.com/ppeiris/7308289
このハック/トリックにより、どこからでも設定値にアクセスできます
$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;