FuelPHPでコントローラのメソッド内でリダイレクトするとafter()に来なくてハマる
- 2018年01月19日
- FuelPHP
FuelPHP 1.8を使っています。
FuelPHPでは、before()やafter()というメソッドが用意されており、よく使っています。
そのクラス内のコントローラメソッドが呼ばれる前(before)と後(after)で、呼ばれるというものです。
before()やafter()に関するマニュアルは、コントローラー概要(FuelPHP)ですね。
実際のコードは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php class Controller_Test extends Controller_Base { public function before() { parent::before(); } public function after($response) { return parent::after($response); } public function action_hoge() { ... } |
大体こんなコードになるかと思います。
あるプロジェクトで、たまたまDB処理とリダイレクト処理が必要となり、このように書きました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Controller_Test extends Controller_Base { public function before() { parent::before(); DB::start_transaction(); } public function after($response) { DB::commit_transaction(); return parent::after($response); } public function action_hoge() { ... ... // // ここでDB::update()等を行った // Response::redirect('foo/bar'); } |
beforeやafterという名前通り、action_hoge()が呼ばれる前にはbefore()でDBトランザクションが開始され、呼ばれた後にはafter()でDBコミットされるだろうと思い、プログラミングをしていたのですが…
試してみるとわかりますが、action_hoge()内で”foo/bar”へリダイレクトされると、after()は呼ばれません。
その結果、「なぜかDB updateが失敗する」という、原因不明のトラブルに見舞われることになりました。
たまたま、「リダイレクトだとafter()に来ない」ということを知っている人が近くにおり、結果的にDBコミットがされないことに気づき、助かりましたが、時間をロスしてしまいました。
「FuelPHPのResponse::redirect()をするとafter()は呼ばれない」というのは覚えておいて損はないと思います。
ITエンジニア募集中!
キュアコード株式会社はITエンジニアを募集しております。少人数の職場なので、上流・下流やサーバー・クライアント対応の垣根なく、あなたの強みを活かしながら いろいろなことにチャレンジ可能です。エンジニアとしての未経験の方、経験が少ない方も歓迎しています。
下記よりITエンジニア募集の採用情報をご覧いただけます。