【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を触っていたりすると混乱しそうです。