CodeIgniter ユーザガイド 日本語版 Version 1.7.3


コントローラ

コントローラは、HTTPリクエストがどのように扱われるかを決定するので、アプリケーションの心臓部だといえます。

コントローラとは?

コントローラは、名前がURIに関連付けられたクラスファイルです。

次のようなURIがあったとします:

example.com/index.php/blog/

上の例では、CodeIgniterは blog.php という名前のコントローラを探して読み込もうとします。

コントローラの名前がURIの最初のセグメントに一致した場合、それが読み込まれます。

やってみよう:  Hello World!

簡単なコントローラを作って、実際に動作を見てみましょう。 テキストエディタを使って、blog.php というファイルを作成し、次のコードを中に書きます:

そして、application/controllers/ フォルダにファイルを保存します。

保存し終わったら、次のようなURLを使ってサイトを訪問してみましょう:

example.com/index.php/blog/

正しく行えば、 Hello World! と見えているはずです。

Note: クラス名は、必ず大文字から始めなくてはいけません。つまり、以下は正しい例になります: <?php
class Blog extends Controller {

}
?>

次の例は正しくありません:

<?php
class blog extends Controller {

}
?>

また、コントローラは、親のコントローラクラスを継承(extends)するのを忘れないでください。そうすることで親クラスのメソッドがすべて継承されます。

メソッド

上の例では、メソッド名は index() になっています。"index"メソッドは、デフォルトでは、第2セグメントが空のときに常に呼ばれるメソッドになります。 下で例示している方法は、"Hello World" メッセージを表示させるもうひとつの方法になります:

example.com/index.php/blog/index/

URIの第2セグメントは、コントローラ内のどのメソッドが呼ばれるかを決めます。

コントローラに新しいメソッドを追加してみましょう。:

さて、 comment メソッドを見るため、次のURLを読み込んでみます:

example.com/index.php/blog/comments/

新しいメッセージを見ることができるはずです。

URI セグメントのメソッドへの引渡し

URLに3つ以上のセグメントが含まれる場合、3番目以降のセグメントは、メソッドに引数として渡されます。

例として、次のようなURIだったとします:

example.com/index.php/products/shoes/sandals/123

URI の 3番目と4番目のセグメント ("sandals" と "123")がメソッドに渡されます:

<?php
class Products extends Controller {

    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

Important: URI ルーティング 機能を使う場合、メソッドに渡されるセグメントは、再ルーティングされた後のものになります。

デフォルトコントローラを定義する

CodeIgniter には、サイトのルートURLがリクエストされる場合のように、通常のコントローラとメソッドを指定するようなURI が表されていないときに、ロードすべきデフォルトコントローラを設定できます。デフォルトコントローラを指定するには、 application/config/routes.php ファイルを開き、次の値をセットしてください:

$route['default_controller'] = 'Blog';

この Blog は利用したいコントローラクラスの名前です。URIセグメントを指定せず、メインのindex.phpをロードしたときデフォルトでは、Hello World メッセージが表示されます。

メソッド呼び出しの再マッピング

上記で述べたとおり、URIの第2セグメントは一般に、コントローラのどのメソッドが呼ばれるかを決めているところですが、CodeIgniter では _remap() メソッドを利用することで、この振る舞いをオーバーライド(再定義)することができます:

function _remap()
{
    // ここに何かのコード...
}

Important:  コントローラに _remap() という名前のメソッドが含まれる場合、それは、URIに何がかかれていようが 常に呼び出されます。それは、どのメソッドを呼ぶかを決めるという標準の振る舞いをオーバーライドするもので、独自のメソッドルーティングルールを定義することができます。

オーバーライドされたメソッド呼び出し(通常はURIの第2セグメントの文字列)は _remap() メソッドの引数として渡されます:

function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

出力を処理する

CodeIgniter には、最終的にレンダリングされたデータをwebブラウザへ送信するのを自動的に取り扱う、出力(Output)クラスがあります。 ビュー出力(Output)クラス の解説ページにより詳しい情報があります。処理が終わったデータを何らかの方法で事後処理し、自分でブラウザに送信したいときがあります。CodeIgniter では、最終処理された出力データを受け取ることができる _output() という名前のメソッドをコントローラに追加することができます。

Important:  コントローラに _output() という名前のメソッドが含まれるとき、それは、処理済のデータが直接送出されるかわりに、常に出力(Output)クラスから呼ばれることになります。 メソッドの第一引数には、処理済データが入ります。

以下に例を示します:

function _output($output)
{
    echo $output;
}

_output() メソッドではデータが処理済の状態で受け取られるということを注意してください。データを_output() メソッドで使う前に、ベンチマークやメモリ使用量のデータはレンダリング済みで、(キャッシュが有効な場合は)キャッシュファイルも書き込まれています。ヘッダも送信済みです (該当機能を利用する場合) 。ページ実行タイマー機能やメモリ使用量の統計機能を使う場合、実行した追加の処理は考慮されないので、完全に正確にはなりません。他に 最終処理の前に 出力をコントロールする方法については、 出力(Output)クラスで利用可能なメソッドをご覧ください。

Private なメソッド

パブリックなアクセスに対して、あるメソッドを隠したい場合があります。メソッドをプライベートにするには、単にアンダースコアを名前の先頭に付加すれば、URLリクエストを経由して実行されなくなります。例えば、次のようなメソッドがあったとします:

function _utility()
{
  // 何かのコード
}

次のようなURLでアクセスしてみてください。これは機能しません:

example.com/index.php/blog/_utility/

サブフォルダへのコントローラの配置

規模が大きいアプリケーションを構築するとき、探しやすいように、コントローラをサブフォルダに配置したいことがあります。CodeIgniter ではこういったこともできます。

application/controllers ディレクトリの中に単純にフォルダを作成し、コントローラクラスをその中に配置します。

Note:  この機能を使うと、URIの第1セグメントはフォルダを指すものになります。例えば、コントローラを次の場所に置いたとします:

application/controllers/products/shoes.php

このコントローラを呼び出すURIは次のようになります:

example.com/index.php/products/shoes/show/123

サブフォルダには、サブフォルダだけを指定したURLのときに呼び出される、デフォルトコントローラをそれぞれおくことができます。デフォルトコントローラの名前は、application/config/routes.php ファイルで指定した名前です。

また、CodeIgniter では、URI ルーティング 機能を利用して、URIの再マッピングをすることができます。

クラスのコンストラクタ

コンストラクタを使用する場合は、どのようなコントローラであるかにかかわらず 必ず 次の行をコードに配置する必要があります:

parent::Controller();

ローカルなコンストラクタは、親コントローラクラスのコンストラクタを上書きしてしまうので、手動で親コントローラクラスのコンストラクタを呼び出す必要があるというのが、この行が必要な理由です。

PHP4でコンストラクタを使うことに慣れていない人のために、コンストラクタはクラス名と全く同じ名前のメソッドになるということを説明しておきます:

<?php
class Blog extends Controller {

       function Blog()
       {
            parent::Controller();
       }
}
?>

PHP 5ではコンストラクタは次の構文を使用します:

<?php
class Blog extends Controller {

       function __construct()
       {
            parent::Controller();
       }
}
?>

コンストラクタはインスタンス化されるときに、初期値をセットする必要がある場合や既定の処理を実行する場合に便利です。コンストラクタは値を返すことができませんが、既定の処理を実行することができます。

予約済みのメソッド名

コントローラは、メインのアプリケーションコントローラから拡張されるので、オーバーライドする場合を除き、アプリケーションコントローラクラスで使われているメソッドと同じ名前にしないよう注意してください。 詳細は、予約語一覧を参照してください。

以上です!

簡単ですが、これでコントローラについてすべてお知らせしました。