CRUDの基本について (9/9)
作成:2015-09-19 11:25
更新:2015-09-19 11:25
更新:2015-09-19 11:25
■$this->request->is(['post', 'put'])の秘密
これでCRUDの基本処理はだいたいできるようになりました。が、最後に一つだけ補足しておきたいことがあります。それは「is」メソッドの引数についてです。
コントローラーでは、POST送信されたことをチェックするのに、isメソッドを使っていました。例えば、addメソッドではこんな具合に使っていましたね。
ところが、editやdeleteでは、こんな形で使われていました。
この違いは何なのでしょうか。そもそも、引数の['post', 'put']というのは、一体何なのでしょう?
この秘密を知るには、editやdeleteでアクセスした際に生成されるフォームのソースコードを見る必要があります。ソースコードを調べてみると、フォーム内にこんなタグが書かれているのに気づくはずです。
これは、フォームヘルパーを使い、createの引数にエンティティを設定すると自動的に追加されるものです。これにより、フォーム送信すると、自動的に_methodという項目が送信されることになります。
requestのisメソッドは、単純に「アクセス方式がGETかPOSTか」をチェックしているわけではありません。CakePHPでは、アクセス方式の情報(というより、「<form>のmethod属性の値」と考えたほうがわかりやすいでしょう)は、「_method」という変数に保管されています。isは、この_methodの値をチェックしているもの、と考えると良いでしょう。
普通にフォームを送信すると、この_methodの値は'post'になります。が、フォームにエンティティを設定した場合、_methodという項目が合わせて送信されるため、_methodの値は、['post', 'put']になるのです。
このため、エンティティを設定したフォームを送信した場合は、is('post')ではPOST送信したと判断されなくなるのですね。
なぜ、そんな面倒なことをしているのか?といえば、おそらくは「エンティティを操作する処理の実行を確実にするため」でしょう。外部から指定のアドレスにアクセスしただけでエンティティを書き換えられたり削除されたりするのは困りますから、単にGET/POSTアクセスしただけでは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のチェックが通らないようにし、こちらで作成したフォームからの送信時にのみ確実に動作するようにしたいのでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る