ECWorks Blog

ECWorks Blog

CakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。

【KtaiLibrary】0.1.0RC1に移行しました

icon_ktaiバージョンを0.1.0RC1とし、問題がなければリリースしたいと考えています。
特にDoCoMoをお持ちの方にセッション関連のテストをしていただけると嬉しいです。

今回は、今更になってしまうのですがiMODEシミュレータ(II)を導入しまして、こちらでも軽いiMODEチェックが出来るようになりましたので、セッション周りは一通り試しました。beta版は全然ダメでしたが、修正が入ってとりあえず正しく動くようになったかと思います。また、namedパラメータ付きのテストが入っていなかったので、追加しました。

そして、肝心のリダイレクト実装に関してですが…
一晩悩み、結局はapp_controller.phpを添付する方向で実装することにしました。リダイレクトはauthだけでなくscaffoldやsecurityでも使っていますので、外部でどうこうするのはやはり無理があるという結論です。
なので、新しく制作する場合はapp_controller.phpをまずコピーしてもらい、制作中のサイトで既にapp_controllerがある場合はredirect関数の部分をペーストしていただくことになります。

一桁(?)の時はライブラリの丸ごとコピーで動作したのでとても簡単でしたが、今回からは、このapp_controller.phpの件と、それからroutes.phpのnamedセパレータの修正が必要になりますので、是非注意していただきたいと思います。

app_controllerといえば、ちょっとはまってしまったのでご紹介。
初めてapp_controllerを設置する場合は、tmp/cache/persistent内をフラッシュしないと、更新されないので注意。何故かというと、App::import(というかtreeかも)でパスをキャッシュしているんですよね。フラッシュしないとcake/libs/controllers/app_controller.phpを読み続けます。
これはapp_controllerの他に、app_modelとか、デフォルトがあるものは全部が対象になるかと思います。


Tagged as: , , , , ,

7 Comments

  1. こんにちは。
    度々で申し訳ないんですが、リダイレクトに関して、コンポーネントのbeforeRedirect()でURLにセッション情報を付加するというのはいかがですか。
    自作のアプリケーションでこの方法を使っているんですが、うまくいっています(i-modeシュミレータIIにて、実機テストはなし)。

  2. アイデアありがとうございます。
    beforeRedirectを使うのはなかなか面白いと思いました。
    自分も使ったことがないコールバックだったのでノーチェックだったです。

    で、ちょっとソースを確認してみたのですが…

    これはCakeのbeforeRedirectの実装の仕方に問題があるのかもしれないのですが、複数のコンポーネントでbeforeRedirectが使われている場合、処理後のURLが保証出来なそうです。URLは後出し有効になるようです。これは、beforeRedirectのフックが、各コンポーネントを一度全て実行させて値を蓄積してから、レスポンスをextractでひとまとめにしているのが原因で、その際にURLが次々と上書きされてしまうのです。実行し、値を反映し、それから次のコンポーネントの実行…という流れなら、文句なくbeforeRedirect法をとるのですが…

    これは非常に悩ましいですね。他のコンポーネントを一切使わないか、beforeRedirectを使わないコンポーネントばかりを使えるのでしたらこれで問題はないのですが、そうとは限らないので。個人的な実装でしたら間違いなく即決で採用したいところですが、今回は万人で使えるものとしての公開なので、ちょっと慎重になっています。

    適用のしやすさからいけば文句なくbeforeRedirectですね。
    欠点は、componentを用いずにhelperだけで運用したい場合にNGになる点ですかね(公開版はヘルパーのみでもリダイレクトが正しく動作します)。
    とりあえず現在はapp_controllerを足してもらう形式をとっているのですが、まあこれはこれで既存のapp_controllerを上書きしてしまう問題があり、説明書にしつこく注意書きしていますけど、どちらが良いかは非常に悩むところです。

    Regenさんのアイデアは大変に有用で感謝していますが、以上の点からapp_controller法で様子を見ようと思います。それとは別で、この問題はチケットを出した方が良いのかもしれませんね。

    有用な情報をありがとうございました。

  3. 他のコンポーネントで値が上書きされることに関しては全く考えていませんでした。
    ソースを改めて見たら、確かにforeach内で単純にextractされているので、最後の値しか有効にならないですね…
    確実に処理をするにはAppControllerに手を加えるしかなさそうですね。

    お手を煩わせてしまってすみませんでした。

  4. チケット投げてみました。

    https://trac.cakephp.org/ticket/6348

    直ることを祈りましょう(笑)。

    【追記】
    重複してしまいました。
    申し訳ないです…

  5. 私もチケット送ってしまいました…
    この問題が直ると、beforeRedirect()が使いやすくなるんですが、果たして直してくれますかね・・・?

  6. まあこればっかりは本家の判断ですから何とも言えないのですが、不具合が出ることは間違いなさそうなので、修正を期待しましょう。

  7. 私の方からもフォローしておきました。
    ところが、読み返してみて問題が正しく伝わりそうになかったので、追加していたらぐちゃぐちゃになってしまいました(大汗。

    順番を入れ替えると値が変わることを伝えるつもりだったのですが、同じキーで上書きという説明をしてはいけなかったですね。違うキーが消えてしまうことを書いていなかったので慌ててしまいました。
    ごめんなさい。