web-dev-qa-db-ja.com

ZF2で変数をlayout.phtmlにグローバルに渡す方法は?

アプリケーション全体で(グローバルに)一連の変数をlayout.phtmlに渡します。それで私は使いたくない

$this->layout()->someVar = someValue;

それは多くの余分な作業とコードになるため、私が持っているすべてのアクションで。では、たった1か所でそれを行う方法はありますか?または私が言ったことは私が得たすべてです!しないでください:)

セッションを使用しているのでしょうか? –レミトーマス

解決策をありがとう。当分の間、それが私が使用しているものです。ログインしたユーザー情報、システムとレイアウトの設定、およびACLリスト。しかし、問題は、適切ではないと思われるlayout.phtmlで新しいオブジェクトを定義する必要があるということです。ビューモデルで使用する必要のあるデータは、コントローラーアクションを使用してデータに渡す必要があることをどこかで読みました。そして、特に私は角を切るのが好きではないので、これを行うためのきれいな方法があれば、私はそれをこの方法でやるのではなくむしろします。そして最近、各ユーザーの未読メッセージの数を取得して、layout.phtmlで使用する必要があります。したがって、layout.phtmlで実行すると、ビューモデルまたはレイアウト内の多くのphpスクリプトになります。

ありがとう

28
Milad.Nozari

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;
40
stefanovalle

これはまさにあなたが望むものです...

// Do this inside your Controller before you return your ViewModel
$this->layout()->setVariable('stack', 'overflow');

// Then inside your layout.phtml
echo $this->stack;

ビューヘルパー、イベントマネージャー、サービスマネージャー、その他のクラスメソッドジャグリングはありません。スタック上の人々が時々物事をとても複雑にするのはなぜですか?

35
Timothy Perez

そのための独自の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();?>

2
Orochi

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;

2
chahat561

次のように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

これがお役に立てば幸いです。

0
KumarA

継承を使用して、レイアウト変数を設定するベースコントローラーを介して繰り返し可能な構成を抽象化してみませんか。ここでは再利用が主な関心事であるため、基本的なOOPで十分です。Zendはすべてを行う必要はありません:)。

0
F.O.O