-世界的にはシェアが大きいPHPフレームワーク。特に記載がない限り1.2-1.3系に関しての記事 #contents *インストール [#t69d6482] DocumentRoot以下に解凍して、書き込み権限を与えるのみ。xamppであればそのままインストール後の設定に進むべし chown -R apache:apache cake/ **mod_rewriteの設定 [#kc62b62d] そのままだとCSSが効かず、 インストールディレクトリの.htaccessにrewriteの設定がされている。 この設定を利用できたほうが何かと便利なのでインストールディレクトリに以下の設定を入れておく。 <Directory "/var/www/html/CAKE_INSTALL_DIR"> AllowOverride FileInfo </Directory> *インストール後の設定 [#n5b2fbd5] **アプリ全体設定 [#ge76ef1c] app/config/core.php -Security.Saltの文字列変更 -date_default_timezone_set('UTC')をTokyo/Asiaへ; (PHP 5.3の場合) **DB接続設定 [#w3544bb6] app/config/database.php.defaultのファイル名変更→database.php -文字化けを防ぐために以下の設定を追加しておくことを進める。 'encoding' => 'utf8' **文字コードの設定 [#s1e81c4d] 全部共通の文字コードはapp/config/core.php Configure::write('App.encoding', 'euc-jp'); 個別には$html->charset('utf-8')で設定できそうだけど、どこで設定するのかな? **複数データベースの設定 [#q6c0e494] modelにデータベースを指定する。何も書かないと当然デフォルトのDBを使う。 **DBのエンコーディングと出力エンコーディングが違うときどうしましょ? [#md925e28] *命名規約 [#a5902397] -DBのテーブルとModelの関係 |テーブル名|コントローラーファイル名|モデル名| |cards|cards_controller.php|Card| |credit_cards|credit_cards_controller.php|CreditCard| **命名規約上の注意 [#ea18a33c] 英単語で分割可能なテーブル名は勝手に分解解釈される。 Highwaysテーブルだとhigh_waysとしてテーブルを作成しないとダメ。 外部結合用のキーフィールド名もテーブルに合わせる必要があるので、まずはモデルを作成して、scaffoldの空コントローラを作成後、テーブル名がCakePHP的に正しいかをチェックしたほうが良い。 *認証 [#r2564106] AuthComponentがある http://blog.ne2ma2.com/archives/160 *TIPS [#j55b2b95] **ログの出力 [#a5ed255c] $this->log("ログ"); app/tmp/log/以下に出力 **外部ファイルの読み込み [#jaf7a2f7] -App::importを使う。 app/libにおいておくと以下のようにインポートできる。 -Cakephpのinclude_pathは以下のコマンドで取得できる。しかし echo get_include_path(); 初期状態ではcakeのROOTとappのディレクトリとPHPのinclude_pathのディレクトリが表示されるはず。 - **View関連 [#o3afca81] |ページのタイトル|$pageTitle変数を設定| |POSTの取得|$params['form']| |GETの取得|$params['url']['hoge']| |セッションkeyの存在チェック|$this->Session->check('key')| **Model関連 [#dca31b46] ***キャッシュについて [#y9fa341a] 毎回DB構造を解析しているのは無駄なので、debugモードの時は15秒、それ以外は999日テーブル構造をキャッシュしている。列変更の時は削除を忘れずに! ***Insert方法 [#k9a2330e] 新規作成時はフィールド名を持つ連想配列を用意して、saveメソッドを呼ぶ。 $data = array("name" => "test"); $this->Model->create(); $this->Model->save($data); -検索結果の取得が一件だけならfind('first')、連想配列がシンプルになる。 -直前にインサートしたID取得にはgetLastInsertID -外部キーとして結合する場合に表示するフィールドを$displayFieldで指定できる。 -外部キーとして結合する場合に表示するフィールドを$displayFieldで指定できる。ただし何もしなくてもよいnameにしておくのが楽。 var $displayField = 'device_name'; ***リレーションをたどらない。 [#qf6f730b] リレーションが不要な場合はパフォーマンスのため以下のコードでリレーションを取得しないようにできる。 $this->Model->recursive = 0; *その他 [#l2fcf7e7] **ファイルの場所情報 [#k686a6e0] -ログファイル CAKE_HOME/app/tmp/logs *使わないシリーズ [#ia3af68a] **Viewを使わない [#e72ffd2d] 各functionの中で以下のように記述 $this->autoRender = false; **Layoutを使わない [#fe65832d] contorollerの中で以下のように記述 $this->layout = ''; **Modelを使わない [#v61341a4] $uses = null **ModelでTableを使わない。 [#j3e9480a] var $useTable = false; *トラブルシューティング [#k69a7a62] **PHPの対応バージョンの問題 [#a5b0ff10] -5.1.6 CentOS5.3 動作実績有り -4.3.9 CentOS4.8 動作実績有りだが、セッションがつながらない不具合あり **DB接続を有効にしたら真っ白 [#p050686f] -PHPのDB接続モジュールが入っていないとまったくの手がかりなくエラーとなる。モジュール入れれば解消。 *CakePHP Modelに沿ったDB定義 [#n824d5ab] -Modelが単数形でテーブル名は複数形となる。なので英語がよろしい。 -IDはつけた方が良い。IDに意味を持たせないサロゲートキー的に使う。 - **MySQL [#xfe038fe] CREATE TABLE users( id int unsigned auto_increment primary key, nickname varchar(30) NOT NULL, created datetime default NULL, modified datetime default NULL ); CREATE TABLE profiles( id int unsigned auto_increment primary key, user_id int unsigned unique, blog_url varchar(256), hobby varchar(256), created datetime default NULL, modified datetime default NULL ); **PostgreSQLでTable定義 [#tf880807] チュートリアルはMySQLしか乗っておらず、日本ではPostgresがまだまだ使われているので記述しておく。 CREATE SEQUENCE car_id_seq; drop table cars; CREATE TABLE cars ( id INTEGER DEFAULT nextval('cars_id_seq') PRIMARY KEY, car_id VARCHAR(50), comment TEXT, created TIMESTAMP DEFAULT NULL, modified TIMESTAMP DEFAULT NULL ); *Link [#g5a580d9] http://www.syuhari.jp/blog/archives/6 *インストール後のトラブルシューティング [#ae0225a6] **1.3系 [#f0b8477c] ***strtotime()でエラー [#u5cf932f] -PHP5.3でcore.phpが解凍そのままだとエラーが出てしまうことがあった。 Warning (2): strtotime() [http://php.net/function.strtotime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead [CORE/cake/libs/cache.php, line 597] Notice: Trying to get property of non-object in /var/www/html/mogi/cake/libs/cache/file.php on line 248 Fatal error: Call to a member function cd() on a non-object in /var/www/html/mogi/cake/libs/cache/file.php on line 248 -config/core.phpのtimezoneを修正 /** * If you are on PHP 5.3 uncomment this line and correct your server timezone * to fix the date & time related errors. */ date_default_timezone_set('Asia/Tokyo'); *2.4系 [#e4eb2460] 1.3とほぼ同じ +timezoneの設定 +security.saltの変更 +tmpの権限変更 +Allow Overrideの設定 +database.phpの作成 **2.4系への移行メモ [#wb110dff] ブラウザキャッシュが強すぎて、一回エラー画面を出してしまうと、ファイルを置いてお反応しないことが多数なので注意。 +ファイル命名ルールの変更 +Htmlヘルパーの変更 +Modelのアソシエーションが効かない(おそらくファイル命名が悪い) +バッチの置き場ががらりと変わっていた。コードはそのまま動いたが **3.0系移行 [#c6f80c3c] 今回もがっつり変わっているので移行が大変。 ***設定系 [#p9e3564e] ***データベースアクセス [#w3f4739d]