【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とか、デフォルトがあるものは全部が対象になるかと思います。

【CakePHP】namedパラメータのセパレータについて皆さんにお聞きしたいこと

cake-logoはい、恥ずかしい文章でCakePHPのバグチケットを投げたのは私です(^^:::::::。
現在形と過去形が入り乱れ、しかも後で読み返したら凄い文章になっていました。フォーラムの投稿と違って、一度書いたら消せないので、超恥ずかしい… 全然ダメダメですね(;^;)。

さて本題なのですが…
namedパラメータでsession.use_trans_sidが動作をしない件は、前回の記事で書いたとおりなのですが、それを回避するKtai Libraryでの実装方法について大変に悩んでいます。実は、先日生け贄になっていただいた方にもご相談し、Router::named[‘separator’]を別の文字にすることで回避しようと決めたのですが、それが実は半分しかうまくいっていないことに気がつき、また迷宮入りしているところです。

実装に関する今までの経緯を簡単に説明すると、session.use_trans_sidを有効とするところまではうまくいったのですが、テストで制作するサイトに載せるとセッションキーを更新しないため、あれこれやっていました。iMODE端末を持っていないため、とりあえずブラウザのセキュリティをいじり、クッキーを用いない設定でアクセスすると、セッションは一向に保存されません。

このとき、制作しているサイトの関係でnamedパラメータ付きのURLで試していたのですが、このパラメータを取ってみたところ問題なく動作し、さらにnamedパラメータのセパレータを「:」から「~」に変更したところ、正しい動きをするようになりました。そこで RFC を確認したところ、「:」は予約されたキャラクターと書かれていたため、これが原因ではないかと確信した次第です。

router.phpを眺めてみたところ、urlを作成している部分はstartup処理内で行っているようなので、それより前の処理として、componentのinitializeで設定すれば間に合うんじゃないかと思い、ktai.php内で書いてみたところ、URLが正しく処理され、想定していたsid付きのURLとなりました。

この方向で実装をしようと方針を決め、リリース寸前まで来ていたのですが、新たに問題が発生! 確かにURLは作られ、一見動作しているように感じたのですが、そのURLが次のレスポンスでnamedパラメータとしてパースされないことが分かりました。何故かというと、argsを取り出しているのがdispatcher内部で、initializeより前にnamedを取り出す処理が完了してしまっていたからです。いろいろ模索をしてみたのですが、タイミング的にrouter.php内のソースを変更する以外に方法は見あたらず、ライブラリとしてこの値をどうにかする方法が採れないことが分かったのです。

ここで問題になるのは2つの事柄です。
まず一つは「namedセパレータを変えることがそもそも受け入れられるのか?」ということです。おそらく以前のバージョンからずっとこのルールの筈ですから、もう世界中に浸透してしまっているURLです。それを「Ktai Libraryでは変えてください」というルールがまかり通るか、ということなのです。
もう一つは「router.phpを直接変更する作業が必要」ということで、ライブラリ化できない部分(つまりインストールするだけでは済まなくなった)点についてどう思われるか、ということです。私的には、この繁雑な作業はバグを生み出す元となる可能性があるため、出来れば避けたいのです。

じゃあ、そもそもnamedセパレータを変えずに、さらにsession.use_trans_sidすらも使わない方法で、手動でsidを埋め込めば? という話になるのですが、それも大変に困難です。何故ならpaginateで必ずHtmlHelper::link()を使っていて、ここに及ばせる方法がないのです。この問題さえなければ、Ktai::link()を必ず使ってもらう方向で進められるのですが、paginateに対応できないとなると、魅力が薄れてしまいます。また、完全対応するためにはHtmlHelperもしくはPaginateにパッチを当てたものをcakeディレクトリにコピーしてもらうことになりかねないため、Cakeのバージョンが上がった場合に不具合を生みかねないという問題もあります。

一応、もう1つの逃げ道は考えられ、app/config/dispatcher.phpで設定してしまう、という方法もアルにはあります。しかしこの段階でRouterはロードされていないため、importする必要が出てきます。つまり、Dispatcher内でRouteは二重に読み込まれることになり、ただでさえ悪名高いimportを重複して使いたくないという思いもあります。でも、今のところライブラリ化出来る唯一の方法かもしれません。

まあ早い話、CakePHPの方でセパレータ文字を別の文字にしてくれれば、何も考えずにsession.use_trans_sidを有効にするだけでセッション問題は解決できるため、これが一番スマートなので、とりあえずチケットを投げたのですが、たぶん無理でしょう。今まで制作したサイトで不具合が出るでしょうから。「RFCの予約文字」と言う点だけが唯一の頼みの綱なのですが…

というわけで、皆さんはどうやったら一番良い方法で解決できると思われるか、是非ご意見を聞きたいです。よろしくお願いいたします。