アプリケーション全体で(グローバルに)一連の変数をlayout.phtmlに渡します。それで私は使いたくない
$this->layout()->someVar = someValue;
それは多くの余分な作業とコードになるため、私が持っているすべてのアクションで。では、たった1か所でそれを行う方法はありますか?または私が言ったことは私が得たすべてです!しないでください:)
セッションを使用しているのでしょうか? –レミトーマス
解決策をありがとう。当分の間、それが私が使用しているものです。ログインしたユーザー情報、システムとレイアウトの設定、およびACLリスト。しかし、問題は、適切ではないと思われるlayout.phtmlで新しいオブジェクトを定義する必要があるということです。ビューモデルで使用する必要のあるデータは、コントローラーアクションを使用してデータに渡す必要があることをどこかで読みました。そして、特に私は角を切るのが好きではないので、これを行うためのきれいな方法があれば、私はそれをこの方法でやるのではなくむしろします。そして最近、各ユーザーの未読メッセージの数を取得して、layout.phtmlで使用する必要があります。したがって、layout.phtmlで実行すると、ビューモデルまたはレイアウト内の多くのphpスクリプトになります。
ありがとう
Orochiが提案しているように、最もクリーンな方法はViewHelperを使用することです。ここで、独自のViewHelperを作成するためのいくつかの手順: http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html 。複雑すぎません;)
ただし、別の方法でも問題を解決できます。必要な変数に、アプリケーションに既に存在する(およびZF2 ServiceManagerによって公開される)サービスによって提供される値が含まれると仮定すると、Module.php内の「onBoostrap」関数(アプリケーションモジュールなど)にいくつかの行を追加できます。
次に例を示します。
public function onBootstrap($e) {
$serviceManager = $e->getApplication()->getServiceManager();
$viewModel = $e->getApplication()->getMvcEvent()->getViewModel();
$myService = $serviceManager->get('MyModule\Service\MyService');
$viewModel->someVar = $myService->getSomeValue();
}
このようにして、1か所でのみ課題を記述します。これで、変数は通常どおりアクセス可能になります。
$this->layout()->someVar;
これはまさにあなたが望むものです...
// Do this inside your Controller before you return your ViewModel
$this->layout()->setVariable('stack', 'overflow');
// Then inside your layout.phtml
echo $this->stack;
ビューヘルパー、イベントマネージャー、サービスマネージャー、その他のクラスメソッドジャグリングはありません。スタック上の人々が時々物事をとても複雑にするのはなぜですか?
そのための独自のViewHelperを作成します。
編集:
モジュールのsrcフォルダー内に新しいViewフォルダーを作成し、このViewフォルダーにHelperという別のフォルダーを作成します。このフォルダーにヘルパークラスを作成します。したがって、たとえば、Navigation.phpファイルを作成します。このファイルでは、AbstractHelperから拡張されるNavigationというクラスを作成します(Zend\View\Helper\AbstractHelperを使用)。次に、パブリック関数__invoke()内にコードを記述しますが、これも結果を返します。また、モジュールのconfig/module.config.php内の「view_helpers」にビューヘルパークラスを追加する必要があります。
'view_helpers' => array(
'invokables' => array(
'nav' => 'Application\View\Helper\Navigation',
),
),
次に、ビューまたはレイアウト内の任意の場所でメソッドとして「nav」を呼び出すことができます。たとえば、nav();?>
Application/Module.phpで1)次のようなzendフレームワークのDispatchイベントを作成します。
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
}
public function loadConfiguration(MvcEvent $e)
{
$controller = $e->getTarget();
$controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
}
2)これで、レイアウト内の定義済み変数に次のようにアクセスできます。$ this-> YOUR_VARIABLE_NAME;
次のようにModuleManagerを使用して、ZendFramework 2のApplication/Module.phpからレイアウトにグローバル変数を渡すことができます。
Application/Module.phpで
ステップ1:
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
use Zend\Mvc\MvcEvent;
ステップ2:
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach('dispatch', array($this, 'loadConfiguration' ));
}
public function loadConfiguration(MvcEvent $e)
{
$controller = $e->getTarget();
$controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE;
}
// Your remaining code here....
}
ステップ3:
Layout.phtmlファイルで、変数を$this->YOUR_VARIABLE_NAME
これがお役に立てば幸いです。
継承を使用して、レイアウト変数を設定するベースコントローラーを介して繰り返し可能な構成を抽象化してみませんか。ここでは再利用が主な関心事であるため、基本的なOOPで十分です。Zendはすべてを行う必要はありません:)。