【CakePHP入門】共通処理を実行する方法(beforefilter)

こんにちは!フリーエンジニアのヤマシタです。

CakePHPには、共通処理を記述することができるコールバックメソッドがあります。

この記事では、

・beforefilterメソッドとは?
・beforefilterメソッドの基本的な使い方

という基本的な内容から、

・beforefilterメソッドで認証処理を設定する方法
・beforeRenderメソッドの使い方
・afterFilterメソッドの使い方

などの応用的な使い方について解説します。

ここではコールバックメソッドについて、詳しく解説していきます!

beforefilterとは

beforeFilterとはControllerで使用するコールバックメソッドで、主に共通化したい処理を記述したいときに使用します。

もう少し噛み砕いた言い方をすると、beforeFilterに記述した処理は、コントローラーに記述されたメソッドを呼び出したときに、メソッドの中身よりも先に実行されます。こういった働きをコールバックといいます。

コールバックの仕組みを使うと各メソッドで同じような処理をしているとき、その共通部分をまとめることができますよね。このため、beforeFilterはコールバックメソッドで、共通化したい処理を記述したいときに使用します、となるわけです。

beforeFilterは以下のように記述します。

function beforeFilter(Event $event) {
  処理・・・
}

beforeFilterは常に一番最初に処理が実行されるため、各アクションを実行する前に共通処理や初期処理を記述するのに適しています。

beforefilterの使い方

ここでは、実際にbeforeFilterの使い方を見ていきましょう。

以下にbeforeFilterで変更した値がView反映されているか、確認するための簡単なサンプルを記述します。

cake/src/Controller/BeforeController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;

class BeforeController extends AppController
{

  //プロパティを宣言
  public $text = 'samurai';

  public function beforeFilter(Event $event) {

    //値を変更する
    $this->text = 'engineer';

  }

  public function index() {

    $this->set('text', $this->text);

  }

}
?>

cake/src/Template/Before/index.ctp

<?php

echo $text;

?>

実行結果

engineer

サンプルでは、beforeFilterとviewを呼び出す関数indexを定義しています。

プログラムを実行すると、beforeFilterが先に呼び出されて処理内でクラスのプロパティの値が変更されます。

実行結果を確認すると、beforeFilterで変更されたプロパティの値が反映されていることがわかりますね!

認証処理の設定

beforeFilterは一番はじめに呼び出されるため、Authなどのユーザー認証を行う処理やエラー内容を設定するのにも適しています。

Authの認証関連の処理は、CakePHP3.4 Red Velvetによると以下のように記述します。

public function beforeFilter(Event $event) {

  // シンプルな設定
  $this->Auth->config('authenticate', ['Form']);

  // 設定を記述
  $this->Auth->config('authenticate', [
    'Basic' => ['userModel' => 'Members'],
    'Form' => ['userModel' => 'Members']
  ]);
}

Authによる認証処理については、以下の記事でも詳しく解説しています!

その他のコールバックメソッド

ここでは、その他のコールバックメソッドについても紹介します。

beforeRenderメソッド

beforeRenderは、Controllerのアクションが実行された直後のViewの関数を呼び出す前に処理が実行されます。

function beforeRender(Event $event) {
  処理・・・
}

使用頻度は少ないですが、「Controller\Controller::render() 」を手動で呼出している場合は必要になるかもしれません。

afterFilterメソッド

afterFilterは、Controllerの各アクションが実行され、Viewの描画が完了したあとに呼び出されます。

function afterFilter(Event $event) {
  処理・・・
}

afterFilterメソッドはコールバックメソッドの中では一番最後に呼び出されるメソッドになります。

各コールバックメソッドは以下のように呼び出されます。

public function beforeFilter(Event $event) {

  echo 'beforeFilter<br>';

}

public function beforeRender(Event $event){

  echo 'beforeRender<br>';

}

public function index() {

  echo 'index<br>';

}

public function afterFilter(Event $event){

  echo 'afterFilter<br>';

}

実行結果

beforeFilter
index
beforeRender
afterFilter

まとめ

ここではコールバックメソッドのbeforeFilterの基本的な使い方や、beforeRenderメソッド、afterFilterメソッドの使い方についても解説しました。

各コールバックメソッドは以下の順番で呼び出されます。
仕組みを把握しておば、要所ごとに適切な共通処理を記述することができますのでぜひ理解しておきましょう。

1. beforeFilter
2. Controllerのアクション
3. beforeRender
4.Viewの処理
5. afterFilter

もしbeforeFilterなどのコールバックメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね。

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部として、これまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー