CodeIgniter 3 Controllersの書き方について(General Topics - Controllers)
CodeIgniter User GuideGeneral 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
- <?php
- class Blog extends CI_Controller {
- public function index() {
- echo 'Hello World!';
- }
- }
ブラウザでhttp://(サーバーIP)/blogに移動すると、こんな内容が表示されます。
ファイル名は大文字ですが、アクセスするときは「blog」と小文字にするのがミソ。
※注意
チュートリアルでroutes.phpを変更している場合は元に戻しておくこと。
- $route['default_controller'] = 'welcome';
- //$route['default_controller'] = 'pages/view';
- //$route['(:any)'] = 'pages/view/$1';
- //$route['news/(:any)'] = 'news/view/$1';
- //$route['news'] = 'news';
- // 追記した部分
- //$route['news/create'] = 'news/create';
(:any)の定義(だと思う)が先に採用され、/blog/indexでアクセスしないと
内容が表示されません。
これ、そうとうハマりました。
Methods
コントローラー名だけで、メソッド名の指定がない場合は「index」が暗黙で
指定されたことになります。
それなので、/blog/indexと明示しても同じ内容が表示されます。
/blog/commentsでアクセスした時に何か表示したい場合は、
commentsというメソッドを実装すればよいです。
- <?php
- class Blog extends CI_Controller {
- public function index() {
- echo 'Hello World!';
- }
- public function comments() {
- echo 'Look at this!';
- }
- }
Passing URI Segments to your methods
引数を受け取りたいときは、メソッドに引数を追記。
uriは、/で引数を区切って指定します。
例えば、/blog/args/(name)/(id)のようなURIで、名前とIDをコントローラーに渡したい場合。
- <?php
- class Blog extends CI_Controller {
- public function index() {
- echo 'Hello World!';
- }
- public function comments() {
- echo 'Look at this!';
- }
- public function args($name, $id) {
- echo $name;
- echo '<br>';
- echo $id;
- }
- }
Defining a Default Controller
サーバールートに直接アクセスされた時呼び出すコントローラーは、
application/config/routes.phpのdefault_controllerで指定します。
- $route['default_controller'] = 'Blog';
Remapping Method Calls
URIで指定した名前でコントローラーのメソッド名を呼び出すルールを
変更したい場合、「_remap」が使用できます。
- public function _remap($method){
- if ($method === 'some_method'){
- $this->$method();
- } else {
- $this->default_method();
- }
- }
サンプルは以下のとおり。
- <?php
- class Blog extends CI_Controller {
- private function process_hello($name) {
- echo 'hello,' . $name;
- }
- private function process_hey($name) {
- echo 'hey!' . $name;
- }
- public function _remap($method, $params = array()) {
- // proccess_xxxが存在するかチェック
- $method = 'process_'.$method;
- if (method_exists($this, $method)) {
- // 存在したら呼び出す
- return call_user_func_array(array($this, $method), $params);
- }
- // なければ404
- show_404();
- }
- }
/blog/hello/symfo
/blog/hey/symfo
/blog/bye/symfo
Processing Output
画面出力を最後にちょっと加工したい場合は、_output()が使えます。
- <?php
- class Blog extends CI_Controller {
- public function hello($name) {
- echo 'hello,' . $name;
- }
- public function hey($name) {
- echo 'hey!' . $name;
- }
- public function _output($output) {
- echo '<br>';
- echo '--- blog.php ---';
- }
- }
/blog/hello/symfo
/blog/hey/symfo
Private methods
コントローラーに記載したメソッドがそのままURIとして使用できるわけですが、
公開されては困るメソッドもあると思います。
そんな場合は、
・private指定する
・メソッド名の先頭に「_」(アンダースコア)をつける
上記いづれか、または両方の指定で非公開になります。
- <?php
- class Blog extends CI_Controller {
- // private指定で非公開
- private function hello() {
- echo 'hello';
- }
- // アンダースコア付きで非公開
- public function _hey() {
- echo 'hey!';
- }
- // これは公開
- public function bye() {
- echo 'bye.';
- }
- }
/blog/hello/
/blog/_hey/
/blog/bye/
Organizing Your Controllers into Sub-directories
application/controllers/と同じ階層にコントローラーを配置しないといけない、
というルールはなく、この階層のサブディレクトリに配置しても構いません。
例えば、application/controllers/products/Shoes.phpというコントローラーを作成してみます。
- <?php
- class Shoes extends CI_Controller {
- public function show($id) {
- echo 'shoes id = ' . $id;
- }
- }
この時のURIは、/[サブディレクトリ名]/[コントローラー名]/[メソッド名]/になります。
/products/shoes/show/123
Class Constructors
コントローラークラスのコンストラクタで何かしたい場合、
以下のように__constructを実装します。
- <?php
- class Blog extends CI_Controller {
- // コンストラクタで、共通の設定などを行う
- public function __construct() {
- parent::__construct();
- $this->name = 'Blog';
- }
- public function hello() {
- echo $this->name . ',hello';
- }
- }
/blog/helloを表示すると、ちゃんとコンストラクタで設定した値が読み込めています。
Reserved method names
予約済で使っては行けない名前がいくつかあります。
コントローラーで注意すべきは、
・__construct
・index
あたりでしょうか。
全ての予約名はこちら。
Reserved Names
CodeIgniter 3のユーザーガイド(User Guide)まとめ
- 関連記事
-
- CodeIgniter 3 Viewの使い方(General Topics - Views)
- CodeIgniter 3 予約語について(General Topics - Reserved Names)
- CodeIgniter 3 Controllersの書き方について(General Topics - Controllers)
- CodeIgniter 3のユーザーガイド(User Guide)まとめ
- CodeIgniter 3のチュートリアル3 Create news items
コメント