カテゴリー別アーカイブ: CakePHP2.x Controller

CakePHP2.x Controller::disableCache

ここではCakePHP2.xでController::disableCacheの使い方を紹介しています。

Cookbook2.xより引用
Controller::disableCache();
ユーザーの使っている ブラウザ に対して、現在のリクエストをキャッシュしないように伝えるために使われます。

登録画面→確認画面→登録完了画面(登録完了処理)とするときSessionでフラグを立ててブラウザの戻るボタンを回避する必要がなくなります。
Controller::disableCache();を使うことによってブラウザのキャッシュを消してくれます。

Controller内に記述

<?php     
    
    function beforeFilter(){
         $this->disableCache();
    }

こうすることでブラウザの戻るボタンを回避することができます。

CakePHP2.x AppControllerを複数作成

ここではCakePHP2.xでAppControllerを複数作成する方法について解説していきます。

cakephp

public function beforeFilter();
などで全ページにかかわる処理をしたい時に管理画面とフロントと処理が違う場合に役に立ちます。

FrontAppController.phpの作成

app/Controller/FrontAppController.php

<?php

    class FrontAppController extends Controller {
   
        /**
         * フロント画面はここが読み込まれます
         */
        public function beforeFilter() {
   
        }
    }

AdminAppController.phpの作成

app/Controller/AdminAppController.php

<?php

    class AdminAppController extends Controller {
   
        /**
         * 管理画面はここが読み込まれます
         */
        public function beforeFilter() {
   
        }
    }

各コントローラで継承

<?php

    // 読み込み
    App::uses('FrontAppController', 'Controller');
   
    class IndexController extends FrontAppController {
        public $components = array('Session', 'Cookie');
          
        public function beforeFilter() {
            parent::beforeFilter();
        }
          
        /**
         * アクションメソッド
         */
        public function index() {
          
        }
    }

これで管理画面とフロント部で処理を分けれます。

CakePHP2.x Controller作成

ここではCakePHP2.xのControllerの簡単な解説をしていきます。

cakephp

サンプルソース

<?php

    class IndexController extends AppController {
        // モデル
        public $uses = array('User');
        // コンポーネント
        public $components = array('Cookie');
   
        public function beforeFilter() {
            parent::beforeFilter();
            $this->set('title_for_layout', 'タイトル');
            $this->setCss();
            $this->setJavascript();
        }
   
        public function index() {
            // post判定
            if ($this->request->is('post')) {
                // POST値 <input name="post" type="text">
                $post = $this->request->data['post'];
                  
                // GET値 http://www.example.com/index?get=hoge
                $hoge = $this->request->query['get'];
                  
                // URLから渡されたデータ http://www.example.com/index/param1/param2
                $param1 = $this->request->pass[0];
                $param2 = $this->request->pass[1];
                  
                // モデルの使用 $this->ModelName->functionName();
                $this->User->getAll();
            }
   
            // 読み込むレイアウトの指定 app/View/Layouts/以下を指定
            $this->layout = 'admin/indexFrame';
            // 読み込むViewの指定 app/View以下を指定
            $this->render('/admin/index');
        }
   
        /**
         * ページ固有のCSS設定
         */
        private function setCss() {
            $arrCss = array();
            // app/webroot/css/以下を指定
            array_push($arrCss, 'admin/hage');
            array_push($arrCss, 'admin/foo');
            $this->set('arrCss', $arrCss);
        }
   
        /**
         * ページ固有のJavascript設定
         */
        private function setJavascript() {
            $arrJavascript = array();
            // app/webroot/js/以下を指定
            array_push($arrJavascript, 'admin/Index');
            $this->set('arrJavascript', $arrJavascript);
        }
    }

解説

public $uses = array(‘User’); (5行目)
使用するモデル名を配列で指定してください。

public $components = array(‘Cookie’); (7行目)
使用するコンポーネントを配列で指定してください。
※Sessionコンポーネントは指定しなくても読み込まれます。

public function beforeFilter() {} (9行目)
一番最初に実行されるブロックです。

parent::beforeFilter(); (10行目)
親クラスのpublic function beforeFilter() {}を実行する場合parent::beforeFilter();をコールしてください。

$this->set(‘title_for_layout’, ‘タイトル’); (11行目)
Viewファイルで使用する変数を設定します。

private function setCss() {} private function setJavascript() {} (42、53行目)
私の自作メソッドなので規約などはありません。

if ($this->request->is(‘post’)) {} (18行目)
POSTされたデータがあればtrueになります。

$post = $this->request->data[‘post’]; (20行目)
$_POST[‘post’]と同じ使い方です。

$hoge = $this->request->query[‘get’]; (23行目)
$_GET[‘get’]と同じ使い方です。

$param1 = $this->request->pass[0]; (26、27行目)
URLから渡されたデータ
URL/区切りで$this->request->pass[0]; 1,2,3・・・と格納されます。

$this->User->getAll(); (30行目)
コントローラー内public $uses = array(‘User’);で指定したモデル名->function名を使用します。
今回の例ではModelクラスにgetAllメソッドがあると仮定しています。

$this->layout = ‘admin/indexFrame’; (34行目)
Layoutファイル読み込み
/app/View/Layouts/から指定してください。

$this->render(‘/admin/index’); (36行目)
Viewファイル読み込み
/app/Viewから指定してください。

CakePHP2.xコントローラーフォルダ分け

ここではCakePHP2.x系のコントローラーをフォルダに分ける方法を解説していきます。

cakephp

今回は例として
/app/Controller/admin/
/app/Controller/front/
と管理画面用コントローラーとフロント用コントローラーに分けていきます。

bootstrap.phpを編集

/app/Config/bootstrap.php

if (preg_match('/admin/', $_SERVER['REQUEST_URI'])) {
    App::build(array(
            'Controller' => array(ROOT.DS.APP_DIR.DS.'Controller'.DS.'admin'.DS),
    ));
}
else {
    App::build(array(
            'Controller' => array(ROOT.DS.APP_DIR.DS.'Controller'.DS.'front'.DS),
    ));
}

$_SERVER[‘REQUEST_URI’]でアクセスがあったURLで管理画面かフロントかを分けています。

URLのルーティング

/app/Config/routes.php

Router::connect('/admin/', array('controller' => 'Index', 'action' => 'index'));
Router::connect('/admin/top/', array('controller' => 'Top', 'action' => 'index'));

http://www.example.com/admin/とアクセスするとadminフォルダのIndexControllerのindexメソッドが呼ばれます。
※アクション名がindexなら’action’ => ‘index’を省略できます。

constファイル作成

/app/Config/bootstrap.phpの最後にconfig(‘const’);を記入してください。

const.phpを作成

/app/Config/const.php

<?php
    /** プロジェクト名 **/
    if (preg_match('/projectname/', $_SERVER['REQUEST_URI'])) {
        define('PROJECT', '/projectname');
    }
    else {
        define('PROJECT', null);
    }
   
    // 管理画面
    if (preg_match('/admin/', $_SERVER['REQUEST_URI'])) {
        define('SITE_URL', PROJECT . '/admin/');
        /** ログイン画面 **/
        define('INDEX', SITE_URL);
        /** TOP画面 **/
        define('TOP', SITE_URL . 'top/');
    }
    // フロント
    else {
        define('SITE_URL', PROJECT . '/');
        define('INDEX', SITE_URL);
    }

これでルーティングされた独自定数の定義が完了。
$this->request->hereと同じ扱いで使用できます。