開発が進んでいくと様々な機能ができてくるわけですが、中には似通ったモジュールが出来上がってきたりするので共通化していきたいという考えになってきます。
CakePHPでも、そのような共通のライブラリを作ることができます(前回同様、環境はCakePHP2系を前提としています)。
Controllerから呼び出す共通コンポーネントの作り方
コントローラーから呼び出す共通ライブラリはコンポーネントと呼ばれ、様々なアクションやコントローラーファイルから利用することができます。
コンポーネントの配置場所は、Controllerディレクトリ内にあるComponentディレクトリです。
$ ls Controller/ AppController.php Component HogeController.php PagesController.php
この中に、共通コンポーネント用のファイル、CommonComponent.phpを作ってみます。
<?php class CommonComponent extends Component { public function getString() { return "Hello"; } }
ファイル名とクラス名は一致しておけばなんでもかまいません。
次に、このコンポーネントをコントローラー側から呼び出してみます。
<?php App::uses('AppController', 'Controller'); class PagesController extends AppController { public $name = 'Pages'; public $components = array('Common'); public function display() { $str = $this->Common->getString(); } }
コンポーネントを使いたい場合は、メンバ変数$componentsにコンポーネント名を配列で指定します。
後は、$thisに続きコンポーネント名とメソッド名を呼び出せば利用可能です。
Viewで利用できる共通ヘルパーの作り方
コンポーネントは、コントローラー側で利用できる共通ライブラリでしたが、ビュー側でもそのような共通のライブラリ機能を利用したいというケースがあります。
ビュー側で利用する共通ライブラリは、ヘルパーと呼ばれテンプレートファイルの中で呼び出しが可能です。
ヘルパーファイルの配置場所は、Viewディレクトリの中にあるHelperディレクトリとなります。
$ ls View/ Elements Emails Errors Helper Layouts Pages Scaffolds
この中に共通のヘルパー用ファイル、CommonHelper.phpを作ってみます。
<?php App::uses('AppHelper', 'View/Helper'); class CommonHelper extends AppHelper { function getPath() { return "/path/to/image/"; } }
こちらも、ファイル名とクラス名は一致させておき、AppHelperのサブクラスとして定義します。
これを、ビュー側から呼び出してみます。
ただ、いきなりビュー側を編集する前にコントローラファイルでコンポーネント同様に、利用するヘルパーを呼び出しておく必要があります。
<?php App::uses('AppController', 'Controller'); class PagesController extends AppController { public $name = 'Pages'; public $helpers = array('Common'); public $components = array('Common'); public function display() { $str = $this->Common->getString(); } }
前述のコントローラに、メンバ変数の$helpersが加わっています。
ここに利用するヘルパーを配列で指定します。
準備が整ったら、ビュー側で使うヘルパーのメソッドを呼び出します。
<div> <?php echo $this->Common->getPath(); ?> </div>
書く場所は、コントローラーとビューとで違いますが、呼び出し方はどちらも同じですね。
ヘルパーからコンポーネントを呼び出す
何れも、共通のライブラリとして機能するわけですが、コンポーネントはシステム処理に必要な機能を定義し、ヘルパーはテンプレート利用する機能と使い方のすみわけが行われたりするものの、お互いで利用したい機能がかぶるということはよくあったりもします。
そういった場合、ヘルパーからコンポーネント内に定義したメソッドを呼び出すことができるので、処理が重複するといったことを避けることができます。
<?php App::uses('AppHelper', 'View/Helper'); class CommonHelper extends AppHelper { function getPath() { App::import('Component', 'Common'); $this->cmm = new CommonComponent(new ComponentCollection()); $str = $this->cmm->getString(); return "/path/to/images/" . $str; } }
上記の例では、先ほど作成したCommonComponentのgetStringメソッドを呼び出しています。
綺麗に処理をまとめていけば、コードもすっきりかけ開発も効率的になるのではないでしょうか。
[PR]重いパソコンがサクサク動くウイルス対策ソフト
[PR]SSLサーバ証明書なら[ドメインキーパー]◆VeriSign/GlobalSign/他取り扱い
関連記事
CakePHPのデフォルトレイアウト「default.ctp」を読み解く
CakePHPでアプリケーション独自の設定ファイルを利用する
CakePHPを利用した簡単アプリケーション開発 ~ ViewとControllerに触れる
CakePHPを利用した簡単アプリケーション開発 ~ Modelを使おう編