【CakePHP】「許可していないHTTPリクエストメソッドを弾く」を実装するときの書き方を整理してみる。

【CakePHP】「許可していないHTTPリクエストメソッドを弾く」を実装するときの書き方を整理してみる。

いつの間にか、薬味のない冷奴なんて食べられない身体になってしまったfukasawaです。こんにちは。
子供の頃は醤油だけで食べられたのに不思議です。

さて、最近はCakePHPのバージョンアップについて調べる機会が増えつつあります。バージョンが上がるとメソッドの追加・廃止等が行われるため、同じ処理を実現したい場合でもバージョンごとに実装方法が異なってきます。
「許可していないHTTPリクエストメソッドを弾く」という処理について調べていたのですが、この処理についてもバージョンによって書き方がいろいろとあるようなので、実装方法を整理をしてみたいと思います。

※現時点の最新バージョンは3.0.3です。

バージョン毎の実装方法

コントローラの処理でHTTPリクエストメソッドが「Post」「Put」でない場合はエラーに飛ばす、という内容で例を見ていきます。

CakePHP 1.x ~ (2.0より非推奨。3.0で廃止)

目的の動作をするメソッドはまだ用意されていないので、if文で目的のHTTPリクエストかどうかを判定し、違っていた場合はエラーに飛ばします。


var $components = array('RequestHandler');
…
if (!$this->RequestHandler->isPost() || !$this->RequestHandler->isPut()) {
     $this->cakeError('error405');
}

※'error405'というエラータイプはデフォルトでは存在していません。エラーハンドラを拡張し405エラー用の処理を用意しているという想定です。

RequestHandlerComponentのisPost()、isPut()を使用してPOST・PUTの判定を行います。

CakePHP 2.0 ~

CakePHP 1.xと同様、目的の動作をするメソッドは用意されていないので、if文で目的のHTTPリクエストかどうかを判定し、違っていた場合はエラーに飛ばします。1.x との違いは、2.0からリクエスト周りの処理が改善され、RequestHandlerComponentのisPost()、isPut()等のメソッドが非推奨となったことです。 代わりにCakeRequest::is()を使用します。


if (!$this->request->is('post') || !$this->request->is('put')) {
     throw new MethodNotAllowedException();
}

※「throw new MethodNotAllowedException()」で405エラーを発生させています。(CakePHP2.0から追加)

CakePHP 2.3 ~ (2.5より非推奨。3.0で廃止)

2.3からはCakeRequest::is()でHTTPリクエストの種類を調べて振り分ける方法の他に、CakeRequest::onlyAllow()を使用できるようになりました。これは、引数で指定したHTTPリクエストのみを許可し、それ以外はエラーにするという今回の目的に合致した動きをするメソッドです。引数で指定されたHTTPリクエスト以外の場合は、405エラー用の例外(MethodNotAllowedException)を発生させます。


$this->request->onlyAllow('post', 'put');

引数を配列で渡してもOKです。


$this->request->onlyAllow(array('post', 'put'));

CakePHP 2.5 ~

CakeRequestクラスのallowMethod()を使用します。使い方は2.3で追加されたonlyAllow()と同様です。(diffしてみたのですが、メソッド名が変更になっているだけで中身は同じでした。)
引数で指定されたHTTPリクエスト以外が渡された場合は、405エラー用の例外(MethodNotAllowedException)を発生させます。


$this->request->allowMethod('post', 'put');

onlyAllow()と同様、引数を配列で渡すこともできます。


$this->request->allowMethod(['post', 'put']);

まとめ

同じメジャーバージョン(2.x)の中でもメソッドの追加、メソッド名の変更があるので、複数プロジェクトでいろいろなバージョンのCakePHPを触っていたりすると混乱しそうです。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ