CakePHPを利用していて、コンポーネントってなに?と思った方は多いのではないでしょうか。
この記事では、
- Component(コンポーネント)ってなに?
- どうやって作るの?
- どうやって使うの?
- どんな場面で便利なの?
と言ったことについて解説していきます。
目次
コンポーネントとはなにか
コンポーネントとは、コントローラーで何度も行う共通の処理を書いたPHPファイルです。いわゆる「関数」と同じく、同じコードを何度も書かなくても済むようにする役割があります。
実際に公式ドキュメントの説明を見てみましょう。
コンポーネントはコントローラー間で共有されるロジックのパッケージです。 CakePHP には、様々な共通のタスクを支援するための素晴らしいコアコンポーネントが用意されています。あなた独自のコンポーネントも作成できます。 もしコントローラー間で コピー&ペーストしたい箇所があった場合、その機能を含むコンポーネントの作成を 検討しましょう。コンポーネントを作成することで、コントローラーのコードを綺麗に保ち、 プロジェクト間のコードの再利用につながります。
CakePHPで既に用意されているコンポーネントもあるし、自分で作成することも可能です。
例えば、ユーザー認証は非常によく使われる機能なのでAuthComponentという形で既にCakePHPによって準備されています。そのAuthComponentの詳しい説明は公式ドキュメント(AuthComponent)に譲るとして、このページではコンポーネントを自作して、利用するところまで解説していきます。
コンポーネントの作り方
まずはコンポーネント用のPHPファイルを作成します。ここではTestComponent.phpという名前にしておきます。
<?php //TestComponent.php namespace App\Controller\Component; //名前空間を定義 use Cake\Controller\Component; //名前空間の使用 class TestComponent extends Component { public function sample() { //共通処理を書く } }
コンポーネントはコントローラーの一部ですから、同じ規約に則ってファイル名とクラス名を同一にする必要があります。
また、あらかじめCakePHPによって用意されているComponentクラスを継承してから共通化したい処理を書いていきます。中身が書けたら「src/Controller/Component」ディレクトリに入れます。
コンポーネントの使い方
次にコンポーネントの使い方について説明します。今回はHogeControllerでコンポーネントに書かれた共通処理を実行することにします。
<?php //HogeController.php use Cake\Controller\Component; class HogeController extends AppController { public function initialize() { parent::initialize(); $this->loadComponent('Test'); //Testコンポーネントを読み込む } public function hogehoge() { $this->Test->sample(); //Testコンポーネントのsample()を実行 } }
コンポーネントの読み込み
上記のように、HogeControllerのコンストラクターとして最後に実行される、initialize()内でコンポーネントを読むことで利用することが出来ます。(13行目)
読み込みでは、
$this->loadComponent('TestComponent');
とは書かず、”Component”を省略します。
コンポーネント内アクションの実行
実行はとても簡単です。「$this->コンポーネント名->アクション名」と書くだけで実行することが出来ます。(18行目)
$this->Test->sample();
コンポーネントの利点
共通処理をコントローラー内に関数として実装した場合に比べて、以下のメリットがあります。
- 他のコントローラーからも利用できる
- コントローラー内のソースコード量が減って可読性が上がる
- 共通処理とそれ以外が明確になって保守性が上がる
共通処理を外部に置くことによって、コードがすっきりとしますし、すべてのコントローラーで再利用可能になります。
また、PHPファイルをあらたに作って共通処理を書き、require_onceで読み込めばいいと思うかもしれません。しかし、CakePHPではAuthComponentなど既存のコンポーネントが仕組みとして存在しているので、わざわざこれ以上仕組みを複雑にする理由は見当たりません。
参考文献
- CakePHP公式ドキュメント「コンポーネント – 3.8」