zz log

zaininnari Blog

CakePHP 2.0.1 の変更点メモ


今回のCakePHP 2.0.1 リリースは、CakePHP2系初のバグフィックス及びメンテナンスリリースです。
修正は100個近いですが、ドキュメントの修正や coreとtestのコードが別コミットものも多数あり、 実態の数としては、少なく感じました。

特に大きい修正としては、以下がありました。

  • CakeEmailクラスの日本語強化
  • Routerクラスのurlencoded/urldecoded の追加
  • habtm モデルのフォームを生成の改善

また、
CakePHP 2.0.1 リリースは、マルチバイトのContent-Length ヘッダー付加に致命的な問題(内容が途中で切り捨てられる)があり、
修正リリース CakePHP 2.0.2 がリリースされています。

主な変更点

  • PhpReader::read() で「php」の拡張子がついているものを優先してチェックするよう変更&ディレクトリを除外
    • 前者は、チェックの順番の変更
    • 後者は、file_exists -> is_file と関数を変更
  • TextHelper::highlight でハイライトする文言の置換で preg_quote が行われるようになった
    • PCRE のデミリタや選択肢を含んだものをハイライトさせようとすると、エラーまたは意図しない挙動を示した。
      • 1.2系がチケットが出され、1.3系・2.0系にも適応された。
  • 最新のZend Community Server で APC が正しく動作しないため、使用条件を強化
    • 「apc_dec(保存した数値を減らす)」がないバグの模様
  • FileEngine にて read のあと(リソースを閉じずに)に write を行うと、(キャッシュエンジンの仕様上)正しく書き込まれない
    • read
      • ハンドルのファイルポインタは終点へ
      • (内容を取得する前には、rewind が呼ばれる)
    • write
      • ftruncate(0)
        • ファイルポインタは変更されないので、現在地点(ファイルの始点から終点まで)を null で埋める
      • fwrite($contents)
        • ftruncate(0) でnullで埋めた直後から、内容を書き込む
        • ファイルの中身は、一行目が「直前のファイル内容が全て null になったもの + 今回書き込んだunixtime」、2行目は、「今回書き込んだ内容」となる
    • read
      • 一行目を読み込んで、unixtimeを取得する
      • この場合、unixtime の前には null があるため、intval の変換で 0 となり、0 < time() が常に真となり、false が返る
      • 書き込んだ内容が取得できない
    • 変更点は、ftruncate(0) をする前に、rewind() を呼びファイルポインタを最初に戻るようになった。
    • intval で変換した変数を 「!== false」と比較しているが、intval の返り値が false となる場合はありうるのか?
  • CakeEmail クラスが生成するヘッダー 「Content-Transfer-Encoding」が 7bit -> 8bit へ変更
    • UTF-8 をデフォルトとしている流れ
    • 強制的なセット(ヘッダーの配列をチェックして云々はない)のため、iso-2022-jp で送りたい場合は、ソースに手を入れる必要がある
  • CakeEmail クラスが生成するヘッダー 「Content-Transfer-Encoding」をセットする場合、文字エンコーディングを考慮するようになった
    • UTF-8 又は Shift_JIS の場合は 8bit、それ以外は7bit がセットされるようになった。
    • ↑のiso-2022-jp で送りたい場合が考慮されていた
  • CakeEmail クラスが生成するヘッダー 「Content-Transfer-Encoding」で文字エンコーディングを考慮するメソッドが private -> protected へ変更された
  • CakeEmail メッセージのエンコーディングを行う場所の変更と日本語テストの追加
  • UpgradeShell の利便性向上、アップグレードするフォルダの探索順序を改善
  • FormHelper::submit の url へ Helper::assetTimestamp() が付加されるようになった
  • CakeResponse Location ヘッダーを送った場合、body を送る前にスクリプトを終了させるよう変更
  • CakeResponse RedirectRoute で↑を行った方が適切なため、コードを戻す
  • RedirectRoute ↑↑に相当する処理を追加
  • AuthComponent user() を使用する際、クッキー&セッションを使用しない認証(Basic認証)を考慮するように変更。
    • クッキー&セッションを使用しない認証の場合、AuthComponent::$_user にユーザ情報を持たせることで対応。
  • CakeRequest 1.3系の 「Opera Mobile」の追加をマージ
  • CakeRoute namedパラメータの urldecode されていなかったのを修正
  • CakeRoute ↑の修正を改善。urlencoded/urldecoded を正しく扱えるように修正
  • FormHelper habtm モデルのフォームを生成する際、1.3系と同様のセレクトタグを生成するように変更
    • 2.0.0では、追加のコードになっていた。
  • DboSource 不必要なコールバックが呼び出されていたのを修正
  • Helper 0.Model.field の形式を正しく扱えるよう修正
  • Layouts/xml/default.ctp XML宣言を削除
    • XML宣言は自前で付加する仕様に変更
    • SimpleXML では、自動的にXML宣言が付加されるため、レイアウトファイルの中身は$content_for_layout だけの方がありがたい
  • basics h() オブジェクトを渡された際の処理を追加
    • Object::__toString がある場合は、そちらを呼び、そうでない場合は、オブジェクト名を返すようになった
  • FormHelper::_isRequiredField $validate を最小構成した際、 'required' 扱いされない
<?php
// 最小構成の例
$validate = array(
    'field' => 'notEmpty',
);
  • AuthComponent::deny deny('*')記法が廃止され、引数なしの呼び出しdeny()だけが、全ての拒否をできるようになった