CakePHP コントローラ規約

・クラス名は複数形で、最後に Controller が付く。


・index()メソッド

 リクエストによってアクションが指定されなかった場合に実行される。


・xxx()メソッドの実行

 http://xxx/apples/view/ は、

 ApplesContoroller の view()メソッドが実行される。


・privateやprotectedなメソッド

 メソッド名の先頭に「_」を付けると内部での利用のみ可能になる。

  protected function _findNewArticles() {

  }


・コントローラとURL

 URLは小文字とアンダースコアを用いる規約があるため、

 RedApplesController の go_pick()メソッドの場合、

 http://xxx/red_apples/go_pick となる。


 http://xxx/contoroller/action/var1/var2 は、

 Contoroller::action($var1, $var2) にマップされる。


・メソッド実行時にモデルが自動的に使える状態になる。

 PeopleControllerのxxx()メソッド実行時に、対応する命名規則の

 Personモデルが自動的に使える(DBのpeopleテーブルに自動的に接続される)ようになる。


・コンポーネント

 コンポーネントは、複数のコントローラで共通の機能をまとめたクラスのこと。


・ビューの描画と送信

 コントローラのメソッドが完了すると、CakePHPはビューの描画と送信を行う

 renderメソッドを自動で実行する。

 規則に従わないビューを描画する場合は、render()を実行する。


 ビューを描画するためのコンテキストを作るために set() を使う。


・リダイレクト

 コントロールとアクションを指定する方法と、相対URL、絶対URLを指定する方法がある。

  return $this->redirect(array('controller' => 'orders', 'action' => 'thanks'));

  return $this->redirect('/orders/thanks');

  return $this->redirect('http://www.example.com');


 アクションにデータを渡す

  return $this->redirect(array('action' => 'edit', $id));


 リファラへリダイレクトする

  return $this->redirect($this->referer());


 クエリ文字列とハッシュを使う

  http://www.example.com/orders/confirm?product=pizza&quantity=5#top

  return $this->redirect(array(

      'controller' => 'orders',

      'action' => 'confirm',

      '?' => array (

         ’product' => 'pizza',

         'quantity' => 5

      ),

      '#' => 'top'));


・フラッシュ

 メッセージを表示してから、リダイレクトのように別のURLへ移動させる。


・コールバック

 CakePHPコアの動作中に自分のロジックを割り込ませたい場合はコールバックを使う。

  ・afterFilter() : ビューの表示を含む全てのコントローラのロジックの後に実行される。

  ・beforeFilter() : コントローラのアクションロジックの実行前に呼ばれる。

  ・beforeRender() : コントローラロジックの実行後、ビューの表示前に実行される。

  ・beforeScaffold($method) : $methodは、index, edit等の呼び出されたメソッド名。

  ・scaffoldError($method) : $methodは、index, edit等の呼び出されたメソッド名。

  ・afterScaffoldSave($method) : $methodは、editかupdateのどちらかの呼び出されたメソッド名。

  ・afterScaffoldSaveError($method) : $methodは、editかupdateのどちらかの呼び出されたメソッド名。


・その他のメソッド

 ・constructClasses() : コントローラに必要とされるモデルをロードする。

 ・referer() : 現在のリクエストに対するリファラURLを返す。

 ・postConditions() : POSTされたモデルのデータをモデルのfind条件にセットするための形式に変換する。

   $conditions = $this->postConditions($this->request->data);

   $orders = $this->Order->find('all', compact('conditions'));


   $this->request->data['Order']['destination'] が "Bakery" の場合、

   array('Order.destination' => 'bakery') に変換する。


   SQL演算子を使用する場合

   $conditions = $this->postConditions(

            $this->request->data,

            array(

               'num_items' => '>=',

               'referrer' => 'LIKE'

            ));

   3つ目のパラメータは、条件の結合を指定する。'AND', 'OR', 'XOR'等。


   最後のパラメータが true で、2つ目のパラメータが配列の場合、

   この配列に含まれない項目は条件に含まない。


  ・paginate() : モデルから取得した結果をページングする。

  ・requestAction() : 任意の場所からコントローラのアクションを呼び出しデータを返す。

  ・loadModel() : コントローラのデフォルトモデルまたはそれ以外のモデルをロードする。


・コントローラ変数

 ・$name : コントローラ名

 ・$uses : コントローラがアクセスできるモデル

      デフォルトで、ProductsControllerは $this->Product で Productモデルへアクセスできる。

 ・$helpers : HtmlHelper, FormHelper, SessionHelperはデフォルトで有効。

 ・$components : コントローラで使うコンポーネントをセットする。

         SessionComponentはデフォルトで有効。

   AppControllerで宣言されているクラスはマージされるので、再度宣言する必要はない。

   class RecipesController extends AppController {

     public $users = array('Recipe', 'User');

     public $helpers = array('Js');

     public $components = array('RequestHandler');

   }


・CakeRequest オブジェクト

 ・リクエスト毎に CakeRequestは1つ作られ $this->request に設定される。


 ・コントローラ、ビュー、ヘルパーの中で利用できる。


 ・リクエストパラメータへのアクセス (下記はいずれも同じ)

   $this->request->pass;

   $this->request['pass'];

   $this->request->params['pass'];


   $this->request->pass : 渡された引数

   $this->request->named : 名前付きパラメータ

   $this->request->plugin : リクエストを処理するプラグイン

   $this->request->controller : 現在のリクエストを処理するコントローラ

   $this->request->action : 現在のリクエストを処理するアクション

   $this->request->prefix : 現在のアクションのプレフィックス

   $this->request->bare : requestAction()から始まりbareオプションを含む時定義される

   $this->request->requested : requestAction()から始まった時trueが設定される


 ・クエリ文字列パラメータへのアクセス (下記はいずれも同じ)

   /posts/index?page=1?sort=title の場合

   $foo = $this->request->query['page']; // パラメータが存在しない場合、エラーが発生する

   $foo = $this->request->query('page'); // パラメータが存在しない場合、nullが返る


 ・POSTデータへのアクセス (下記はいずれも同じ)

   name属性が、 'data[Post][title]' の場合

   $title = $this->request->data['Post']['title']; // キーが存在しない場合、エラーが発生する

   $title = $this->request->data('Post.title'); // キーが存在しない場合、nullが返る


 ・リクエストを調べる

   $this->request->is('get') : リクエストがGETかどうか

   $this->request->is('put') : リクエストがPUTかどうか

   $this->request->is('post') : リクエストがPOSTかどうか


・CakeRespose オブジェクト

 ・コンテンツタイプの制御

  $this->response->type(arrayn('vcf' => 'text/v-card'));


 ・ファイルの送信

  $file = $this->Attachment->getFile($id);

  $this->response->file($file['path']);

  // レスポンスオブジェクトを返すとビューの描画を中止する。

  return $this->response;


 ・ファイルのダウンロード

  $this->response->file($file['path'], array('download' => true, 'name' => 'foo'));


 ・ヘッダの設定

  $this->response->header(array(

              'Location' => 'http://www.examplecom',

                   'X-Extra' => 'My header'));


■ファイル名とクラス名の規約

 ・xxx というクラスのファイル名は、xxx.php