【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などのコールバックメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次