コントローラーからモジュール構成にアクセスするにはどうすればよいですか?
8 に答える
私はまったく同じ問題を抱えていて、決定的な答えを見つけることができなかったので、これがどれほどあいまいであるかに本当に驚いています. ZF2 のドキュメントがこれについて何かを述べていると思う人もいるでしょう。とにかく、試行錯誤を繰り返して、この非常に単純な答えに出くわしました。
内部コントローラー機能:
$config = $this->getServiceLocator()->get('Config');
Module クラス関数 (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 の Getting Started with 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',
),
),
),
...
アプリケーションが完全にブートストラップされた後に追加の初期化を行う必要がある場合は、Module クラスで init メソッドをブートストラップ イベントにアタッチできます。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;
});
}
コントローラーでは、config を取得できます。
print_r($this->config);
モジュールのみの構成を読み取るには、モジュールは LocatorRegisteredInterface を実装するだけです
前:
namespace Application;
class Module
{
// ...
}
後:
namespace Application;
use Zend\ModuleManager\Feature\LocatorRegisteredInterface;
class Module implements LocatorRegisteredInterface
{
// ...
}
その実装は、LocatorRegistrationListener がモジュール インスタンスをサービス ロケータに名前空間\Moduleとして保存することを示しています。
次に、モジュールにアクセスできる場所ならどこでも:
class IndexController extends AbstractActionController
{
public function indexAction()
{
/** @var \Application\Module $module */
$module = $this->getServiceLocator()->get('Application\Module');
$moduleOnlyConfig = $module->getConfig();
// ...
}
}
モデルから ServiceLocatorAwareInterface を実装する必要があります。そして、サービスマネージャーに直接アクセスできる setServiceLocator() と getServiceLocator() を設定できます。このコードサンプルを見てください https://gist.github.com/ppeiris/7308289
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 マスターにマージされた後にのみ行うことができます。
このハック/トリックにより、どこからでも任意の構成値にアクセスできます
$configReader = new ConfigReader();
$configData = $configReader->fromFile('./config.ini');
$config = new Config($configData, true);
コントローラーとビューで構成を読み取るためのコントローラープラグインとビューヘルパーを使用してモジュールを作成しました。GitHub リンク__ Composer リンク
コンポーザー経由でインストールする
composer require tasmaniski/zf2-config-helper
config/application.config.phpファイルに新しいモジュール「ConfigHelper」を登録します
'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;