CodeIgniter 3 Controllersの書き方について(General Topics - Controllers)

CodeIgniter User Guide

General TopicsのControllersについて調べてみます。
Controllers


What is a Controller?



例えばこんなURIにアクセスした時
example.com/index.php/blog/

Blog.phpというコントローラーがあれば、それが呼び出されます。




Let's try it: Hello World!



application/controllersにBlog.phpというファイルを作成。
以下の内容を記載します。

※ファイル名の先頭は「大文字B」であることに注意!
また、クラス名の先頭も大文字です。「小文字b」はNG。


・application/controllers/Blog.php


  1. <?php
  2. class Blog extends CI_Controller {
  3.     public function index() {
  4.         echo 'Hello World!';
  5.     }
  6. }





ブラウザでhttp://(サーバーIP)/blogに移動すると、こんな内容が表示されます。
ファイル名は大文字ですが、アクセスするときは「blog」と小文字にするのがミソ。

534_01.png


※注意
チュートリアルでroutes.phpを変更している場合は元に戻しておくこと。


  1. $route['default_controller'] = 'welcome';
  2. //$route['default_controller'] = 'pages/view';
  3. //$route['(:any)'] = 'pages/view/$1';
  4. //$route['news/(:any)'] = 'news/view/$1';
  5. //$route['news'] = 'news';
  6. // 追記した部分
  7. //$route['news/create'] = 'news/create';



(:any)の定義(だと思う)が先に採用され、/blog/indexでアクセスしないと
内容が表示されません。

これ、そうとうハマりました。




Methods



コントローラー名だけで、メソッド名の指定がない場合は「index」が暗黙で
指定されたことになります。

それなので、/blog/indexと明示しても同じ内容が表示されます。

534_02.png



/blog/commentsでアクセスした時に何か表示したい場合は、
commentsというメソッドを実装すればよいです。


  1. <?php
  2. class Blog extends CI_Controller {
  3.     public function index() {
  4.         echo 'Hello World!';
  5.     }
  6.     
  7.     public function comments() {
  8.         echo 'Look at this!';
  9.     }
  10.     
  11. }




534_03.png




Passing URI Segments to your methods



引数を受け取りたいときは、メソッドに引数を追記。
uriは、/で引数を区切って指定します。

例えば、/blog/args/(name)/(id)のようなURIで、名前とIDをコントローラーに渡したい場合。


  1. <?php
  2. class Blog extends CI_Controller {
  3.     public function index() {
  4.         echo 'Hello World!';
  5.     }
  6.     
  7.     public function comments() {
  8.         echo 'Look at this!';
  9.     }
  10.     
  11.     public function args($name, $id) {
  12.         echo $name;
  13.         echo '<br>';
  14.         echo $id;
  15.     }
  16.     
  17. }




534_04.png




Defining a Default Controller



サーバールートに直接アクセスされた時呼び出すコントローラーは、
application/config/routes.phpのdefault_controllerで指定します。


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




534_05.png




Remapping Method Calls



URIで指定した名前でコントローラーのメソッド名を呼び出すルールを
変更したい場合、「_remap」が使用できます。


  1. public function _remap($method){
  2.     if ($method === 'some_method'){
  3.         $this->$method();
  4.     } else {
  5.         $this->default_method();
  6.     }
  7. }





サンプルは以下のとおり。


  1. <?php
  2. class Blog extends CI_Controller {
  3.     
  4.     private function process_hello($name) {
  5.         echo 'hello,' . $name;
  6.     }
  7.     
  8.     private function process_hey($name) {
  9.         echo 'hey!' . $name;
  10.     }
  11.     
  12.     public function _remap($method, $params = array()) {
  13.         
  14.         // proccess_xxxが存在するかチェック
  15.         $method = 'process_'.$method;
  16.         if (method_exists($this, $method)) {
  17.             // 存在したら呼び出す
  18.             return call_user_func_array(array($this, $method), $params);
  19.         }
  20.         
  21.         // なければ404
  22.         show_404();
  23.     }
  24.     
  25. }




/blog/hello/symfo

534_06.png


/blog/hey/symfo

534_07.png


/blog/bye/symfo

534_08.png






Processing Output



画面出力を最後にちょっと加工したい場合は、_output()が使えます。


  1. <?php
  2. class Blog extends CI_Controller {
  3.     
  4.     public function hello($name) {
  5.         echo 'hello,' . $name;
  6.     }
  7.     
  8.     public function hey($name) {
  9.         echo 'hey!' . $name;
  10.     }
  11.     
  12.     public function _output($output) {
  13.         echo '<br>';
  14.         echo '--- blog.php ---';
  15.     }
  16.     
  17. }





/blog/hello/symfo

534_09.png


/blog/hey/symfo

534_10.png





Private methods



コントローラーに記載したメソッドがそのままURIとして使用できるわけですが、
公開されては困るメソッドもあると思います。

そんな場合は、
・private指定する
・メソッド名の先頭に「_」(アンダースコア)をつける

上記いづれか、または両方の指定で非公開になります。


  1. <?php
  2. class Blog extends CI_Controller {
  3.         
  4.     // private指定で非公開
  5.     private function hello() {
  6.         echo 'hello';
  7.     }
  8.     
  9.     // アンダースコア付きで非公開
  10.     public function _hey() {
  11.         echo 'hey!';
  12.     }
  13.     
  14.     // これは公開
  15.     public function bye() {
  16.         echo 'bye.';
  17.     }
  18.     
  19. }




/blog/hello/

534_11.png


/blog/_hey/

534_12.png


/blog/bye/

534_13.png




Organizing Your Controllers into Sub-directories



application/controllers/と同じ階層にコントローラーを配置しないといけない、
というルールはなく、この階層のサブディレクトリに配置しても構いません。

例えば、application/controllers/products/Shoes.phpというコントローラーを作成してみます。


  1. <?php
  2. class Shoes extends CI_Controller {
  3.         
  4.     public function show($id) {
  5.         echo 'shoes id = ' . $id;
  6.     }
  7.     
  8. }





この時のURIは、/[サブディレクトリ名]/[コントローラー名]/[メソッド名]/になります。


/products/shoes/show/123

534_14.png






Class Constructors



コントローラークラスのコンストラクタで何かしたい場合、
以下のように__constructを実装します。


  1. <?php
  2. class Blog extends CI_Controller {
  3.     
  4.     
  5.     // コンストラクタで、共通の設定などを行う
  6.     public function __construct() {
  7.         parent::__construct();
  8.         $this->name = 'Blog';
  9.     }
  10.     
  11.     public function hello() {
  12.         echo $this->name . ',hello';
  13.     }
  14.     
  15. }





/blog/helloを表示すると、ちゃんとコンストラクタで設定した値が読み込めています。

534_15.png





Reserved method names



予約済で使っては行けない名前がいくつかあります。

コントローラーで注意すべきは、
・__construct
・index

あたりでしょうか。

全ての予約名はこちら。
Reserved Names





CodeIgniter 3のユーザーガイド(User Guide)まとめ

関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ