Friction River Software

  • お問い合わせ

CakePHP5入門【コラム⑭】linkとpostLink

A子

ユーザのアイコン画像を変更できるようになったのは良いんだけどさー

元の「デフォルト画像」に戻したいときって、(現状)ワンクリックでは無理だよね?

B美

そうね

Webサーバ上での操作が必要になるかな

C菜

「削除」リンクでよく使っている「$this->Html->postLink()」を使って、その処理を行うメソッドを呼び出せば良いんじゃないでしょうか~
(「確認ダイアログ」付きで~)

A子

お、良いねぇ
(問答無用で変更しちゃうと、「うっかり」が発生したときに困るしね(苦笑))

C菜

では、さっそくやってみましょう~

「templates/Users」の中にある「change_image.php」内にコードを追加しますね~

A子

よし、テストしてみよう
…って、エラーだ!

何で?

C菜

エラーログを見てみましたけど、「postLink」の行が悪いって言うだけで、よくわからないです~

B美

実は、そのコード…
「postLink」の箇所を「link」に変更するだけで、問題なく動くわよ

それ以外は何も変えずに…

A子

んん?

問い合わせのダイアログって、普通のリンクでも出せるの?

B美

もちろんよ

あと、「src/Controller」の中にある「UsersController.php」だけど、勝手に「defaultImage」メソッドを追加しといたから…

public function defaultImage($id = null)
{
    $this->copyImage($id);

    return $this->redirect(['controller' => 'Top', 'action' => 'index']);
}

まぁ、親クラス(AppController)で定義している「copyImage」メソッドを呼び出してるだけなんだけど…








C菜

おぉ~、バッチリです~

それにしても、なぜ「postLink」ではダメだったのでしょうか~?

B美

それは「link」がGETリクエストで、「postLink」が(その名の通り)POST送信だからよ

「postLink」を使うと、勝手にformタグを補完する(埋め込む)のよ

A子

あっ!
さっきのコードってformタグの内側に書いたから、formの中にformが入れ子で存在する形になっちゃったんだ

そりゃエラーになるわな(苦笑)

C菜

この場合って、本来どちらを使うべきなんでしょう~?
(「link」と「postLink」の~)

B美

単なる「閲覧」ならばGETでOKなんだけど、「追加」「更新」「削除」のように何らかの変更がシステムに加えられる場合はPOSTにすべき

…ってことは、(この場合)本来ならば「postLink」を使うべきなのよね
(GoogleのクローラなんかがGETリクエストしてくるかもしれないし…)

A子

うーん

その言い方だと、(「postLink」の利用は)難しいってことかな?

B美

ええ

なにしろ、このページにはすでにformタグが存在しているからね

C菜

このページってログイン必須ですし、confirm(確認ダイアログ)も行ってますから、大丈夫なんじゃないですか~?

B美

それじゃ、ブラウザのアドレス欄(URL)に次の一文を直接入力してみなさい

https://192.168.1.205/authapp/users/default-image/1

あ、C菜のアカウントで試してみてね
(C菜のidは「3」だけど…)

C菜

えっと~

何も起こりませんけど~

A子

うぎゃー

私のアイコン画像が勝手にデフォルトに戻ってるじゃん

B美

さっきのURLの末尾の「1」って、A子のidだからね(笑)

…ってなわけで、「UsersController.php」の「defaultImage」メソッドはこう書くべきなのよ

public function defaultImage()
{
    $this->copyImage($this->identity->id);

    return $this->redirect(['controller' => 'Top', 'action' => 'index']);
}

C菜

でしたら「templates/Users」の中にある「change_image.php」についても、こう書くべきですね~
(GETパラメータを渡さないように~)

B美

上出来よ

「postLink」が使えたならば、最初のコードでも良かったんだけどね(苦笑)

A子

なるほどねぇ
GETリクエストって、URL内にパラメータ(引数)を指定できるから(直接操作される可能性があって)怖いってことか…

てか、私のアイコン画像設定を(勝手に)実験で使わないでよ(怒)