CakePHPの共通のライブラリの作り方 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

開発が進んでいくと様々な機能ができてくるわけですが、中には似通ったモジュールが出来上がってきたりするので共通化していきたいという考えになってきます。

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メソッドを呼び出しています。


綺麗に処理をまとめていけば、コードもすっきりかけ開発も効率的になるのではないでしょうか。