CakePHP3のComponentでControllerを参照してView変数をset

スポンサーリンク

CakePHP3 のコントローラーのコンポーネント(Component)を作成していて、コンポーネントの中からコントローラーを参照したい機会がありました。具体的には、複数のコントローラー・アクションで共通して使用するビュー用の変数を、共通化して Component で set したかった。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
CakePHP 3.1.1
PHP 5.5.19

以下、サイドメニューで使うメニューのビュー用変数のセットを、コンポーネントで共通化する例です。

コントローラー側のコード

まずはコンポーネントを利用するコントローラー側のコードです。$components 配列に使うコンポーネントを指定することで、コントローラー内でコンポーネントを利用可能となる。

src/Controller/NavigationsController.php

src/Controller/ProductsController.php

$this->Common->setMenus(); の呼び出しは、beforeFilter() で行っても良いかと思います。

コンポーネント(CommonComponent)側のコード

続いて、コンポーネント側のコードでは、コントローラを参照するために $this->_registry->getController(); を利用します。コンストラクタ(initialize メソッド)内で参照するコントローラーをセットしました。

src/Controller/Component/CommonComponent.php

上記のように書くことで、Component から Controller を参照して、その Controller にビュー用の変数を set できます。上記例では、共通して利用するメニュー用の $groups, $categories, $tags の3つのビュー用変数をセットしています。

以上でメニュー用の変数セットをコンポーネント化して共通化できました。ただし、共通化したいビューの変数をセットするために、Component から Controller を参照するこの方法がベストなのかどうかは確信は持てません。共通化のための親クラスを一つ作り、そこで共通のビュー変数をセットして、各々子クラスで継承するという方法も可能でしょう。

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!