初めてのcodeigniter2 基本編

初めてcodeigniterを学んだのでまとめます。

## 概要

* コンポーネントはない 

* オブジェクト指向 

## URL(URI)の書き方

* 基本形

> アプリケーションのURL/index.php/コントローラーのクラス名/メソッド名/引数
> http://localhost:8000/index.php/blog/index/3

:::note info
クラス名の拡張子(.php)は書かない
:::

初期状態ではindex.phpは絶対呼び出される。
以下を追記すればindex.phpはURlから消しても良い

```php:application > .htacess
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
//追記する
```
<br>

* サブフォルダに入っている時の呼び出し方法

>アプリURL/ディレクトリ名/フォルダ名/メソッド名/引数
>http://localhost:8000/products/shoes/index/3

<br>

* privateなメソッドの書き方

```php
private function _utility()
{
// 何かのコード
}
```
コントローラーに _remap() があると、それ以外のメッドが無視されて _remap()のみ処理が実行される
```php
public function _remap()
{
//ここのコードが絶対呼ばれる
//→オーバーライドされる
}
```

* コンストラクタ

```php
public function __construct()
{
parent::__construct();
// 処理
}
```

## Viewについて

* 基本

application/views/ 
直下に作成

* 呼び出し方

```php:基本
$this->load->view('ビューのファイル名',ビューに渡すデータ); 
//ファイル名の拡張子(.php)は不要 

$string = $this->load->view('ビューのファイル名',ビューに渡すデータ, true);
//第3引数をtrueにすると（デフォルトはfalse）ブラウザにビューを送るのではなく文字列としてビューのデータを返す
```
複数ビューの呼び出し方
```php:ヘッダビュー、メニュービュー、コンテントビュ、フッタビュー 
function index() 
{ 
    $data['page_title'] = 'Your title'; 
    $this->load->view('header'); 
    $this->load->view('menu'); 
    $this->load->view('content', $data); 
    $this->load->view('footer'); 
} 
```

ビューをサブフォルダに入れた場合の呼び出し方
```php:
$this->load->view('フォルダー名/ファイル名'); 
```

配列かオブジェクトに格納して渡す
```php:blog.php
function selfIntroductionShow(){ 
    
    $myInfo = array( 
    'name' => 'たぬきち', 
    'age' => 35, 
    'height' => 169 
    ); 
    $this->load->view('selfIntroduction',$myInfo); 
} 
```

呼び出された側
```php:selfIntroduction.php
<html>
<head>
<title>selfIntroduction</title>
</head>
<body>
    <!-- 受け取った連想配列のキー名が変数になる -->
    <h1><?php echo '私の名前は'.$name; ?></h1><br>
    <h1><?php echo '年齢は'.$age; ?></h1><br>
    <h1><?php echo '身長は'.$height; ?></h1>
</body>
</html>
```

* ループの作成

>配列やオブジェクトを複数（コレクション？）を渡した時のview側でのループのさせかた

controller側
```php:blog.php
function favoriteFoods(){
		$data['food_list'] = array('カレー', 'ラーメン', '寿司');
		$data['heading'] = "私の好きな食べ物をランキング形式でご紹介！！！";
		$this->load->view('favoriteFoods', $data);
	}
```

ループさせるview側
```php:favoriteFoods.php
<html>
<head>
<title>私の好きな食べ物</title>
</head>
<body>
<strong><?php echo $heading;?></strong>
<ol>
<?php foreach ($food_list as $food):?>
<li><?php echo $food;?></li>
<?php endforeach;?>
</ol>
</body>
</html>
```
<br>

出力結果
***


<strong>私の好きな食べ物をランキング形式でご紹介！！！</strong>
<ol>
<li>カレー</li>
<li>ラーメン</li>
<li>寿司</li>
</ol>

***
<br>
<br>


## モデル

* 基本
application/models/
の直下に格納

```php
class モデル名 extends CI_Model {

    function __construct(){
        parent::__construct();
    }
}
// モデル名は必ず大文字
```

モデルの呼び出し
```php:blog.php
//読み込み方//
$this->load->model('モデルのクラス名');
//サブディレクトリの場合//
$this->load->model('ディレクトリ名/モデルのクラス名');

//呼び出し方//
$this->モデル名->function();
//別名をつけた時の呼び出し方//
$this->load->model('モデル名', '別名');
$this->別名->function();                       
```


* モデルの自動読み込み
application/config/autoload.phpファイルを開き、そのモデルを autoload 配列に追加する

* DB接続
```php
//　自動接続の場合
// 第3引数にtrueを渡す
$this->load->model('Model_name', '', TRUE);

// 手動接続の場合
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;

$this->load->model('Model_name', '', $config);
```


## ヘルパー関数
手続型の関数
読み込まないと使えない
application/helpers、system/helpersの順でヘルパー関数が読み込まれているか確認する

* ヘルパー関数の読み込み方

example_helper.phpという関数を読み込みたい場合
```php:blog.php
$this->load->helper('exsample'); // _helper は不要

$this->load->helper( array('helper1', 'helper2', 'helper3') ); //複数のヘルパーを読み込む場合
```
javaでいうimportみたいなもの？
viewでも使用可能
変数に代入しない

* 自動読み込み

複数のファイルで必要な場合。グローバルにしたいとき
`application/config/autoload.php`のautoload配列にヘルパーを追加する。

<br>

*  ヘルパー関数の拡張

application/helpers/直下に
`application/helpers/MY_ヘルパー関数名_helper.php`(もとのヘルパー関数にMY_をつけたもの)
というファイルを作成しオーバーライドする

## ライブラリ

* 基本

利用可能なライブラリは system/libraries フォルダにある。

*使い方

```php:blog.php
$this->load->library('クラス名'); 

$this->load->library(array('クラス名1', 'クラス名2')); //複数呼び出し
```

* ライブラリの作成

application/libraries ディレクトリに作成する


* クラス作成時のパラメーターの引き渡し
```php:blig.php
$params = array('type' => 'large', 'color' => 'red');
$this->load->library('Someclass', $params);
```
コンストラクタ作成時に以下のようにする
```php:
public function __construct($params){
// $paramsをつかった処理
}
```

## ドライバ

>親クラスと子クラスが1対多の関係の特別な種類のライブラリ。子クラスは親クラスにアクセスできるが、他の子クラ>スにはアクセスできない。

system/libraries フォルダに配置する
ドライバの使用方法
```php:blog.php
//初期化方法
$this->load->driver('ドライバクラス名');
//呼び出し方法
$this->ドライバクラス名->some_method();

//子クラス、ドライバそれ自身は、初期化せずに親クラスを通して直接呼び出すことができる
$this->親クラス名->子クラス1>メソッド名1();
$this->親クラス名->子クラス2->メソッド名2();
```
<br>

## コアクラス
>CodeIgniter が実行されるたびに、フレームワークの一部として自動的に初期化されるいくつかの基本クラス

Benchmark、Config、Controller
Exceptions、Hooks、Input
Language、Loader、Log
Output、Router、URI、Utf8

## オートロード
CodeIgniter には、"オートロード" 機能があり、これを使えば、ライブラリ、ヘルパー、 およびモデルをシステム実行時に常に初期化することが可能になる。

"libraries" フォルダにあるコアクラス
"helpers" フォルダにあるヘルパーファイル
"config" フォルダにあるカスタム設定ファイル
"system/language" フォルダにある 言語ファイル
"models" フォルダにあるモデルファイル
リソースを自動読み込みするには
`application/config/autoload.php` ファイルを開き、 autoload という名前の配列に、読み込みたい項目を追加する。 

## ルーティングの再設定
ルーティングは通常`クラス名/メソッド名/引数`だが、変更することができる

```php:application/config/routes.php
//基本形
$route['新しいクラス名 / 新しいメソッド名'] = "元のクラス名/元のメソッド名";
//ワイルドカードを使用する場合
//numはセグメント内が数字の場合マッチ
$route['新しいクラス名 / :num'] = "元のクラス名/元のメソッド名";
//anyはセグメント内がどんな文字列でもマッチ
$route['新しいクラス名 / :any'] = "元のクラス名/元のメソッド名";
```
```php:例
$route['journals'] = "blogs";
//URL の第1セグメントに "journals" という語を含む URL は、"blogs" クラスに再マッピングされる
$route['blog/joe'] = "blogs/users/34";
//blog/joe というセグメントが含まれる URL は、"blogs" クラスの "users"メソッドに引数34で再マッピングされる
$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";
//第1セグメントが "product" 第2セグメントに数値が設定された URL であれば、"catalog" クラスの "product_lookup_by_id" メソッドにマッチした値を変数として再マッピングされる
```
```php:正規表現
$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";
```
```php:予約ルート
$route['default_controller'] = 'welcome';
//URLがデータを含まない時に、どのコントローラを呼ぶべきかを指定するもの。"welcome"クラスがロードされる
$route['404_override'] = '';
//リクエストされたコントローラが見つからない場合に、どのコントローラを呼ぶべきかを指定するもの
```

<br>

## エラー処理
* ログファイルにメッセージを書き込む

```php:使用例
if ($some_var == ""){
  log_message('error', '変数に値が含まれていませんでした');
}else{
  log_message('debug', '変数に値が正しくセットされました');
}

log_message('info', '変数の目的は、●●の値を提供することです');
```
>erro:エラーメッセージ。PHP のエラーやユーザのエラーなど、実際のエラー
>debug:クラスが初期化されたとき、デバッグ情報としてログをとることができる
>info:優先度が最も低いメッセージで、単に何かの処理についての情報


## プロファイル
>プロファイル：プログラムのパフォーマンスを測定すること

```php:blog.php
$this->output->enable_profiler(TRUE);
//メソッドの任意の場所に記述するとレポートが生成される

$this->output->enable_profiler(FALSE);
//プロファイラを無効にする
```

* ベンチマークの観測点をセットする 
ベンチマークのデータをプロファイラを使ってコンパイルし表示するには、特定の構文を使って観測点の名前を付ける必要がある。


* プロファイラセクションの有効化と無効化
2通りある
```php:application/config/profiler.php
//①アプリケーション全体のデフォルトを指定する
$config['config'] = FALSE;
$config['queries'] = FALSE;
```

```php:blog.php
//コントローラ内で出力クラスの set_profiler_sections() メソッドをコールすることで設定ファイルの値を上書きする
$sections = array(
'config' => TRUE,
'queries' => TRUE
);

$this->output->set_profiler_sections($sections);
```
<br>

利用可能なセクションとそれにアクセスする為の配列のキー
<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
		<tr>
			<th>キー</th>
			<th>説明</th>
			<th>既定値</th>
		</tr>
		<tr>
			<td class="td"><strong>benchmarks</strong></td>
			<td class="td">ベンチマーク観測点での経過時間と総実行時間</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>config</strong></td>
			<td class="td">CodeIgniter の設定変数</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>controller_info</strong></td>
			<td class="td">リクエストされたコントローラのクラスとメソッド</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>get</strong></td>
			<td class="td">リクエストに渡されたすべての GET データ</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>http_headers</strong></td>
			<td class="td">現在のリクエストの HTTP ヘッダ</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>memory_usage</strong></td>
			<td class="td">現在のリクエストで消費されたバイト単位のメモリ容量</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>post</strong></td>
			<td class="td">リクエストに渡されたすべての POST データ</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>queries</strong></td>
			<td class="td">実行時間を含む、実行されたすべてのデータベースクエリの一覧</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>uri_string</strong></td>
			<td class="td">現在のリクエスト URI</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>session_data</strong></td>
			<td class="td">現在保存されているセッションデータ</td>
			<td class="td">TRUE</td>
		</tr>
		<tr>
			<td class="td"><strong>query_toggle_count</strong></td>
			<td class="td">ブロックを初期状態で非表示にするクエリの数</td>
			<td class="td">25</td>
		</tr>
	</table>
<br>

## キャッシュ

ページごとにキャッシュの設定ができる
`application/cache`に書き出される
保存時間を設定可能

* 有効化の補法

```php:blog.php
$this->output->cache(キャッシュを有効にしておく分数);
```
コントローラーのどこに記述してもOK
ただしviewに遷移するコントローラーに限る


## 本番環境でのエラーの停止
```php:application/index.php
define('ENVIRONMENT', 'development'); //エラーが全て表示される

define('ENVIRONMENT', 'production'); //エラーが表示されない
```