スキップしてメイン コンテンツに移動

[PHP]今更のCakePHPまとめ

なんやかんやでPHPのフレームワークはCakePHPに落ち着いてしまう私ですが、しばらく開発期間が空いてしまうと色々細かい部分を忘れてしまうし、CakePHP2系の情報が1系に比べると少ない気がするので、一旦まとめてみようかと。ちなみに、対応バージョンは安定版の2.2.1です。



CakePHP2.2.1の入手

入手については、こちら、もしくはgithubからgit cloneするかしてください。

初期設定

ダウンロードしたファイルを展開してウェブ領域にコピーすれば設置完了。
パーミッションエラーの場合は、シンボリックリンク貼ったディレクトリの親ディレクトリのパーミッションをチェック(←未来の私用です。Linuxのeclipseで開発する時は、workspaceに置いてシンボリックリンク貼るようにしている)。
その他50XのInternal Errorはmod_rewriteを怪しむ。cpした場合は、.htaccessなどがコピーできてないかも。

そのあたりが解決すれば、CakePHPのwelcome的なページが表示される。手を入れていない場合は、tmpディレクトリのパーミッション設定
#エラーが出てるディレクトリまで掘ってから
chown -R 0777 tmp

一気に3、4個のエラーは解消できる。本当はapacheやらをオーナーにして書き込み権限を与えるのが正解だと思うがそれの議論は本質ではないのでパス。

次はDBの設定。ホスト名、ユーザー名、パスを入れる。UTF-8の指定をコメントアウトしてもいい。その場合はDBやテーブル自体がLatin1になってないかチェックする。まじうざいから。

ソルトの設定。文字列を直接書き換えてもいいし、後ろに好きな文字を付け足してもいい。これは2箇所(Security SaltとCypher Seed)。

これでひとまずの設定は終わり。ここから開発に突入できます。

Ubuntuはデフォルトでmod_rewriteが有効になっていない。
a2enmod rewrite

httpd.confとかその辺でAllowOverride All的な設定をすると幸せ。


基本的な事

  • 私の場合は、Controllerを作ってからViewを作り、Modelを作る。だいたい、Controllerで全力を使うので、Viewがありませんというエラーを見て、Modelがないというエラーを見る。
  • ControllerとViewは複数形で命名、Modelは単数形で命名というのをよく忘れる。
  • メンバ変数、$helpersにViewで使いたいヘルパーを書く。とりあえずは、「var $helpers = array("Html", "Form");」を書いておけば、Viewの時に困らない。
ちょっと書き方がアレですが、しばらく離れるとこういう細かくて大事なことがスッポリ抜けちゃう年頃なのです・・・。

2系のcookbookはリンクが見つからなかったけれど翻訳済のものがアップされているので、適宜確認する。 → CakePHP Cookbook v2.x documentation(日本語)


DB検索

// Controller内
// where句はconditionsというArrayを作る
    $this->Post->find("all", array("conditions"=>array("sex"=>"male", "country"=>"ja")));

// 欲しいフィールドだけ
    $this->Post->find("all", array("fields"=>array("name", "age")));

// 並び順
    $this->Post->find("all", array("order"=>"asc"));

findの第一引数には色々種類がある。
all
条件(conditions)に合致する行を全て取得する
first
条件(conditions)に合致する先頭の1行だけ取得する
count
条件(conditions)に合致する行数を取得する
list
条件(conditions)に合致する行をFormで加工しやすい形にして取得する
threaded
謎.oO(配列をネストして構造化されたデータが返ってくるようだけれど、使い方が難しそう)
neighbors
id=10としたら、id=9とid=11のデータを返す

Cookbookからのコピペだけど、これはかなり便利。
public function view($id = null) {
        $this->Post->id = $id;
        $this->set('post', $this->Post->read());
    }

データ入力などの業務系のアプリを作るなら、素直にCakePHPのO/Rマッパーとadd()、edit()、delete()、routerで作ったほうが圧倒的に速い。工数を細かいチューニングに割けるようになる。ただしある程度習熟してたらの話。いきなりは無理。私も無理。だからこうやってまとめているのです。

詳しくはAPIのドキュメントにオプションが取りうるパラメータがリストアップされているのでチェック → Model - CakePHP API


$_GET、$_POSTはいずこへ?

直接、$_GETにアクセスすればもちろん取得できますが、フレームワーク使ってて、ちゃんとアクセス方法が用意されてるなら、そっち使ったほうが後々楽な事もある(んじゃないかな?)。
ということで、CakePHPが用意したオブジェクト経由で$_GET、$_POSTにアクセスする。
// Controller内
// $this->request->dataにFormやURLの引数やらが入っている。
// $this->request->is() でHTTPメソッドの種類をチェックできる

    if($this->request->is("post")){
        $this->Post->save($this->request->data);
    }

以上はフォームの入力データを手っ取り早くDBへ突っ込むコード。バリデーションはModelに書くのでControllerでは意識しない。

バリデーションは空白ダメとか○文字以上○文字以下とかから正規表現を使ったこじゃれたものや、独自の関数を通してガッツリバリデーションすることもできる。
以下、APIのドキュメントからコピペ(ページが長くてアンカーがなかったので)。
// 空白禁止
    public $validate = array(
        'name' => 'notEmpty'
    );

// アルファベットのみ(正規表現)
    public $validate = array(
    'name' => '/^[a-z].+$/i'
    );

// 文字数チェック(5文字以上、25文字以下)
    public $validate = array(
        'age' => array(
            'rule' => array('between', 5, 25)
        )
    );

// 独自のバリデーション関数を通す方法
    public $validate = array(
        'password' => array(
            'rule' => array('customValidation')
        )
    );
    // バリデーション関数の定義
    public function customValidation($data) {
        // $data will contain array('password' => 'value')
        if (isset($this->data[$this->alias]['password2'])) {
            return $this->data[$this->alias]['password2'] === current($data);
        }
        return true;
    }

見るに耐えるHTMLを目指す

CakePHPの標準CSSセットは割とできがいい。マージンの取り方が適当にやっても21世紀的な見た目になる。更にHTMLの見た目にもこだわるなら、あのサイトと同じ見た目になる事請け合いな、「Twitter Bootstrap」をオススメします。

最近のBootStrapは高機能になってきて、JavaScriptやlessなんかも取り込んでだんだん大きくなってきている。よくわからない事も多々あるけれど、とりあえず使いたいという場合は、
git clone https://github.com/twitter/bootstrap.git
cd bootstrap
make bootstrap
# コンパイルが終わったら
cd bootstrap
ll
合計 20
drwxrwxr-x 5 ystream ystream 4096 2012-08-16 15:48 ./
drwxr-xr-x 8 ystream ystream 4096 2012-08-16 15:48 ../
drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 css/
drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 img/
drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 js/

以上の3つのディレクトリの中のファイルをwebroot直下にある同名のディレクトリにコピーすれば完了です。
ちなみにコンパイルできなかった人はnodeをインストールしてから
npm install recess uglify-js jshint -g
# -gオプション付きなのでsudoした方がいいかも

とすると、コンパイルに必要なツールが揃います。
いつからかnpmは同梱されるようになったんですねぇ。

さて、bootstrapを準備したら、CakePHPのLayoutディレクトリにあるdefault.ctpにbootstrap読み込み用のタグを追記する。
<?php echo $this->Html->css("bootstrap.min.css"); ?>
// もしくは
    <?php echo $this->Html->css("bootstrap-responsive.min.css"); ?>

これで追加完了。CakePHPデフォルトのCSSと衝突する可能性もあるので、bootstrapの方が後に読み込むように調整する。
CakePHPのデフォルトCSSを読まないと、SQLクエリの実行結果表示が腐るので、邪魔している部分は別途CSSを用意してCakeデフォルトを上書きするか、潔くデフォルトを捨てるか。SQLの実行結果はテストで利用することもあるのでソースコードのテストが終わるまでは残して、本番では使わない、でいいと思います。適当にやってください。


URLにも凝りたい

CakePHPは例えばウェブ領域のサブディレクトリにシステムを置いたとしても、正しくURLを取得してくれるので、内部リンクの生成は、CakePHPに丸投げしていい。更にURLを簡便にしたい(example.com/post/add/ を example.com/addpost/ にする)場合はrouter.phpにURLの指定をすればいい。
良い感じにまとまっている資料があるので、1.2系用のものだけれどチェックしてみてください。割とそのまま使えます。 → 極める routes.php (CakePHP 1.2)


後は詰まったら詰まった時に検索、もしくは初心に戻ってCookBook、もしくはAPI Documentでなんとか乗り切ってください。
PHPでなら書けるのに、CakePHPの機能を一生懸命探すのは、割と時間の無駄な時もある(特にDBのクエリなど)ので、フレームワークに頼らない書き方でケリをつけるのもアリだと思います。またリファクタリングする時が来るまでに勉強しておきましょうって感じでどうでしょう?

see also:
CakePHPの細かいTIPS Twitter Bootstrapとの絡みとか


コメント

このブログの人気の投稿

[VB.NET]オレオレ証明書でSSL通信するための短絡的な解決法

VB.NETソフトウェアでサーバーと通信することはよくある事だと思いますが、最近はHTTPを使って明けっ広げに刺しに行くよりHTTPSを使って暗号化してこそこそやった方が時代の流れに即した感じですよね(違うか)。 いちいちテスト環境でSSL証明書を用意するのも面倒だということで、セキュリティ的には全くよろしくない方法で迂回できるので紹介します。

[JS]Canvasでよく使う描画テクまとめ

HTMLで画像をいじくりたい時は、canvasを利用して編集するのは一般的ですが、WindowsストアアプリではHTML+CSS+JSでのアプリ開発ができる事もあって、簡単な画像編集であれば、C#やVBを使うより分かりやすいし資料が多く、C++でDirectXをガリガリ書くよりお手軽。入出力もファイルピッカーを使えば簡単に実装できます。今回は、Windowsのコードではなく、Canvasを利用する時のJavaScriptを使いどきに合わせてまとめていきます。

curl の基本的な使い方 -設定編-

今回のcurl TIPSは、curlをより日常的に使っていくためのHow toです。curlには、数多くのオプションが用意されていて、それらを組み合わせる事で様々な事が楽になるでしょう。サービス監視の自動化などにはまさにcurlの得意分野です。 今回は、curlを更に自分のものにしていくために大事なカスタマイズの部分を解説します。