Help us understand the problem. What is going on with this article?

CakePhp3のComponentの使い方まとめ

More than 1 year has passed since last update.

コンポーネントとは

CakePhp3でコンポーネントとは、各コントローラ間で共通の処理をまとめたもの。
コンポーネント - 3.7

用意されているコンポーネント

よく使われるようなコンポーネントは用意されている。
以下のようなものがある。

  • 認証(AuthComponent)
  • クッキー(CookieComponent)
  • クロスサイトリクエストフォージェリ(CsrfComponent)
  • フラッシュ(FlashComponent)
  • セキュリティ(SecurityComponent)
  • ページ制御(PaginatorComponent)
  • リクエストハンドリング(RequestHandlerComponent)

()内はそれぞれのクラス名だが、実際に使用する場合はコンポーネントより前の部分(AuthComponentであれば、Auth)を使うため、これをコンポーネント名として、以下の説明をしていく。

使い方

コンポーネントを読み込む

コンポーネントを読み込む方法には、フィールドで宣言する方法とloadComponentを使う方法、自分でインスタンス化する方法があるが、Controller、Component、Shellのどこから使うかによって、使える方法が異なる。

方法 Controller  Component Shell
loadComponent OK NG NG
フィールド宣言 OK OK NG
インスタンス化 OK OK OK

フィールドで宣言する

使いたいクラスのpublicフィールドとして、配列$componentsを宣言し、その中にコンポーネント名を書いていく。

AuthComponentとCookieComponentの読み込み
 public $components = ["Auth", "Cookie"];

各コンポーネントに引数(配列)を渡す場合、コンポーネント名をキー、引数を配列として$componentsを宣言する。

AuthComponentとCookieComponentの読み込み
 public $components = ["Auth" => [/*AuthComponentの引数*/],
                       "Cookie" => [/*CookieComponentの引数*/]];

この方法の場合、宣言したクラスのすべてのメソッドで、指定したコンポーネントのインスタンスに$this->コンポーネント名でアクセスすることができる。

loadComponentを使う

loadComponentメソッドで、第1引数にコンポーネント名を指定すると、そのコンポーネントのインスタンスが返ってくる。
第2引数は省略可能だが、配列を渡すとコンポーネントの引数として渡される。

AuthComponentの読み込み
$this->Auth = $this->loadComponent('Auth',[/*引数*/]);

自分でインスタンス化する

自分でインスタンス化することもできる。
まずは、以下の3つのクラスを読み込む。

クラス読み込み
use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use App\Controller\Component\使うコンポーネントのクラス名;

複数のコンポーネントを読み込む場合は、その分だけ使うコンポーネントのクラスをuseしておく。

コンポーネントをインスタンス化する場合には、第1引数にComponentRegistry、第2引数にコンポーネントの引数(省略可能)を渡してインスタンス化する。

AuthComponentの読み込み
$this->Auth = new AuthComponent(new ComponentRegistry(), [/*引数*/]);

コンポーネントを使う

各種の方法でインスタンス化されたコンポーネントのメソッドを呼び出せばいいだけ。
loadComponentや自分でインスタンス化する場合も、$this->コンポーネント名のフィールドにインスタンスを格納しておくと使いやすいと思う。

AuthComponentの使用例
$this->Auth = $this->loadComponent('Auth');
$this->Auth->user('username');//AuthComponentのuserメソッドの呼び出し

作り方についても近いうちにまとめます。
→まとめました
CakePhp3のComponentの作り方まとめ

frost_star
まだまだ半人前プログラマー。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away