これでCRUDの基本処理はだいたいできるようになりました。が、最後に一つだけ補足しておきたいことがあります。それは「
is」メソッドの引数についてです。
コントローラーでは、POST送信されたことをチェックするのに、
isメソッドを使っていました。例えば、
addメソッドではこんな具合に使っていましたね。
if ($this->request->is('post')) {……
ところが、
editや
deleteでは、こんな形で使われていました。
if ($this->request->is(['post', 'put'])) {……
この違いは何なのでしょうか。そもそも、引数の
['post', 'put']というのは、一体何なのでしょう?
この秘密を知るには、
editや
deleteでアクセスした際に生成されるフォームのソースコードを見る必要があります。ソースコードを調べてみると、フォーム内にこんなタグが書かれているのに気づくはずです。
<input type="hidden" name="_method" value="PUT">
これは、フォームヘルパーを使い、
createの引数にエンティティを設定すると自動的に追加されるものです。これにより、フォーム送信すると、自動的に
_methodという項目が送信されることになります。
requestの
isメソッドは、単純に「アクセス方式がGETかPOSTか」をチェックしているわけではありません。CakePHPでは、アクセス方式の情報(というより、「
<form>の
method属性の値」と考えたほうがわかりやすいでしょう)は、「
_method」という変数に保管されています。
isは、この
_methodの値をチェックしているもの、と考えると良いでしょう。
普通にフォームを送信すると、この
_methodの値は
'post'になります。が、フォームにエンティティを設定した場合、
_methodという項目が合わせて送信されるため、
_methodの値は、
['post', 'put']になるのです。
このため、エンティティを設定したフォームを送信した場合は、
is('post')ではPOST送信したと判断されなくなるのですね。
なぜ、そんな面倒なことをしているのか?といえば、おそらくは「エンティティを操作する処理の実行を確実にするため」でしょう。外部から指定のアドレスにアクセスしただけでエンティティを書き換えられたり削除されたりするのは困りますから、単にGET/POSTアクセスしただけではisのチェックが通らないようにし、こちらで作成したフォームからの送信時にのみ確実に動作するようにしたいのでしょう。