CakephpのControllerの備忘録

データベーステーブルを作らずにコントローラーを作成する

コントローラーオブジェクトを生成する際には、同時にモデルオブジェクトも生成されます。
そのモデルオブジェクトはデータベースに同名のテーブルを必要とするので、同名のテーブルを作成していない場合エラーが吐かれます。
このエラーは、コントローラーの "uses" プロパティを null にセットしておくことで回避できます。

<?php

class PostsController extends AppController {
    public $name = 'Posts';
    public $uses = null;
}

任意のレイアウトファイルを使う

cakephpをダウンロードしてきた状態では、用意されているレイアウトファイルが使用されます。
また、”APP/views/layouts/default.ctp” を作成すると、特に指定しない場合にはこれが使用されます。
任意のレイアウトファイルを使用したい場合には、コントローラーの "layout" プロパティを設定します。

<?php

class PostsController extends AppController {
    public $name = 'Posts';
    public $uses = null;
    
    public $layout = 'mylayout';
    # => APP/views/layouts/mylayout.ctp
}

ちなみに、"default.ctp" の中には、

<?php echo $content_for_layout; ?>

が必要です。"$content_for_layout" は cakephp によって自動的にセットされます。その内容に関しては次項に記述します。




Controller::render() に関して

Controller::render() は Controller::$autoRender が true のとき、各アクションの処理が終了した後に呼ばれるメソッドです。
特に何もしていない場合、"APP/views/{CONTROLLER_NAME}/{ACTION_NAME}.ctp" が読み込まれます。
任意のビューを使いたい場合には以下のようにします。

<?php

class PostsController extends AppController {
    public $name = 'Posts';
    public $uses = null;
    public $layout = 'mylayout';

    // $this->autoRender = true のとき、
    // アクションの処理が終わってから呼び出される
    public function render() {
        return parent::render('/posts/default');
        # => APP/views/posts/default.ctp が使われる
    }
}

また、特定のアクションでは別のビューを使いたいというときには、以下のようにします。

<?php

class PostsController extends AppController {
    public $name = 'Posts';
    public $uses = null;
    public $layout = 'mylayout';

    public function render() {
        return parent::render('/posts/default');
    }

    public function hoge() {
        $this->set('hoge', 'fuga');
        
        parent::render('/posts/hoge');
        # => APP/views/posts/hoge.ctp が使われる
    }
}

デフォルトの "default.ctp" の置き場所

"APP/views/layouts/default.ctp" を作成する前は、元々用意されているレイアウトファイルが使われる。
使われるファイルは "CAKE/libs/view/layouts/default.ctp" にある。
また、"home.ctp" は "CAKE/libs/view/pages/home.ctp" にある。
これら二つの内容は参考になるので、みておくと良いかもしれません。