- 更新日: 2015年11月4日
- PHP & CakePHP
CakePHP3のComponentでControllerを参照してView変数をset
CakePHP3 のコントローラーのコンポーネント(Component)を作成していて、コンポーネントの中からコントローラーを参照したい機会がありました。具体的には、複数のコントローラー・アクションで共通して使用するビュー用の変数を、共通化して Component で set したかった。
— 環境 —
CakePHP 3.1.1
PHP 5.5.19
以下、サイドメニューで使うメニューのビュー用変数のセットを、コンポーネントで共通化する例です。
コントローラー側のコード
まずはコンポーネントを利用するコントローラー側のコードです。$components 配列に使うコンポーネントを指定することで、コントローラー内でコンポーネントを利用可能となる。
src/Controller/NavigationsController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Controller; use App\Controller\AppController; class NavigationsController extends AppController { public $components = ['Common']; public function index() { $this->Common->setMenus(); // ... } public function view($id = null) { $this->Common->setMenus(); // ... } // ... } |
src/Controller/ProductsController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Controller; use App\Controller\AppController; class ProductsController extends AppController { public $components = ['Common']; public function search() { $this->Common->setMenus(); // ... } public function view($id = null) { $this->Common->setMenus(); // ... } // ... } |
$this->Common->setMenus(); の呼び出しは、beforeFilter() で行っても良いかと思います。
コンポーネント(CommonComponent)側のコード
続いて、コンポーネント側のコードでは、コントローラを参照するために $this->_registry->getController(); を利用します。コンストラクタ(initialize メソッド)内で参照するコントローラーをセットしました。
src/Controller/Component/CommonComponent.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\Controller\Component; use Cake\Controller\Component; use Cake\Core\Configure; class CommonComponent extends Component { public function initialize(array $config) { $this->Controller = $this->_registry->getController(); } public function setMenus() { $this->Controller->set('groups', Configure::read('groups')); $this->Controller->set('categories', Configure::read('categories')); $this->Controller->set('tags', Configure::read('tags')); } // ... } |
上記のように書くことで、Component から Controller を参照して、その Controller にビュー用の変数を set できます。上記例では、共通して利用するメニュー用の $groups, $categories, $tags の3つのビュー用変数をセットしています。
以上でメニュー用の変数セットをコンポーネント化して共通化できました。ただし、共通化したいビューの変数をセットするために、Component から Controller を参照するこの方法がベストなのかどうかは確信は持てません。共通化のための親クラスを一つ作り、そこで共通のビュー変数をセットして、各々子クラスで継承するという方法も可能でしょう。
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
Leave Your Message!