CodeIgniter を触ってみる


![codeigniter_logo (1).png](https://qiita-image-store.s3.amazonaws.com/289/29618/1def1e89-db0c-8fa5-0c57-485670c0b9c9.png "codeigniter_logo (1).png")

昨日は

[他 LL 出身者のための PHP 入門前夜 - Qiita](http://qiita.com/sqrtxx/items/17c31c00b9630cf49f41)

を触ってみたので, 今日は CodeIgniter を触ってみる.

## 導入

2 系の最新版を落としてくる. なお, 3.0 以降はライセンス問題が解消されているようだ.

[CodeIgniter 3のライセンスがMITライセンスに変更され、いわゆるライセンス問題は完全に解消 — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something](http://blog.a-way-out.net/blog/2014/10/31/codeigniter-3-license-mit/)

今回は `2.2-stable` を利用する. 公式の zip でも良いのだけれど, あえて github から落としてくる.

```bash
git clone git@github.com:bcit-ci/CodeIgniter.git
cd CodeIgniter/
git checkout 2.2-stable
cd ..
mv CodeIgniter test
```

[bcit-ci/CodeIgniter](https://github.com/bcit-ci/CodeIgniter)
[CodeIgniter Tutorial – Learn CodeIgniter in 40 minutes | RevillWeb](http://www.revillweb.com/tutorials/codeigniter-tutorial-learn-codeigniter-in-40-minutes/)


## 表示

とりあえず `php -S` してみる.

```bash
php -S localhost:3000
```

http://localhost:3000/ にアクセスすると以下が表示される:congratulations:

![ 2014-12-03 10.41.52.png](https://qiita-image-store.s3.amazonaws.com/289/29618/c56b0a41-b768-2bcd-de02-a1888e65dc6e.png " 2014-12-03 10.41.52.png")

## Controller

### add rooting

新規ルーティングを作ってみる. path に対して controller class を指定すれば良いようだ. ここで指定する class はおそらく snake_case か.
`/application/config/routes.php` より

```
$route['test'] = 'test';
```

を追加.
ルーティングは以下のような構造を取る.

```
example.com/class/function/id/
```

[URI Routing : CodeIgniter User Guide](http://www.codeigniter.com/user_guide/general/routing.html)

### add controller

対応する controller を用意する.
どうやら `/` は index, `/hoge` は hoge メソッドを用意すれば良いようだ (なお `http://localhost:3000/test/hoge/` と `http://localhost:3000/test/hoge/fjkaljfkldajfkla/fdajklfjakl/fdjaklf` は同一視される.)

`application/controllers/sample.php` より,

```php
<?php

class Sample extends CI_Controller {

    public function index()
    {
        $this->load->view('sample_index');
    }

    public function hoge()
    {
        $this->load->view('sample_hoge');
    }

}
```

### add view

`sample_index`, `sample_hoge` は view に置く.
`application/views/sample_index.php`

```php
<!DOCTYPE html>
<html lang='ja'>
  <head>
    <title>sample index</title>
  </head>
  <body>
    <h1>sample index page</h1>
  </body>
</html>
```

`application/views/sample_hoge.php`


```php
<!DOCTYPE html>
<html lang='ja'>
  <head>
    <title>sample hoge</title>
  </head>
  <body>
    <h1>sample hoge page</h1>
  </body>
</html>
```

- http://localhost:3000/sample/
- http://localhost:3000/sample/hoge

アクセスすると, ちゃんと閲覧できる.

### パーシャル

部分的に使いまわす場合は view の中で
`<?php $this->load->view("hogehoge"); ?>` としてやればよい.

## Migration

### DB との接続

MySQL でとりあえず走らせる.
まず mysql から

```bash
mysql -u root
```

```mysql
grant all privileges on *.* to sample@"localhost";
SET PASSWORD FOR sample@"localhost"=password('sample');
```

```bash
mysql -usample -psample
```

データベースを作成する.

```
create database sample character set utf8;
```

設定を変更.
`application/config/database.php` より,

```php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$active_group = 'default';
$active_record = TRUE;

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'sample';
$db['default']['password'] = 'sample';
$db['default']['database'] = 'sample';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;
```

[Using CodeIgniter 2 with SQLite 3 databases | Living with technology](http://khromov.wordpress.com/2012/06/22/using-codeigniter-2-1-with-sqlite-3-databases/)

migration ファイルを作る.
最初に migration を格納するディレクトリを作成する.

```bash
mkdir application/migrations
```

今回は user table を作る migration を用意する.
user は id, name を持つ. 命名規則厳しく, 間違っていると動かないので注意.

`application/migrations/001_add_user.php` より,

```
<?php

class Migration_Add_User extends CI_Migration {

    public function up(){
        $this->dbforge->add_field(array(
            'user_id' => array('type' => 'INT', 'constraint' => 11,
                               'unsigned' => TRUE, 'auto_increment' => TRUE),
            'name'    => array('type' => 'VARCHAR', 'constraint' => '255')
        ));
        $this->dbforge->add_key('user_id', TRUE);

        $this->dbforge->create_table('users', TRUE);
    }

    public function down(){
        $this->dbforge->drop_table('users');
    }

}
```

これを実行するための migration controller を以下をそのままコピペして作成する.

[PHP - Codeigniterのmigration - Qiita](http://qiita.com/shikataka/items/d3fd15f650f85a8ce118)

migrate 実行

```bash
php index.php migrate latest
```

mysql に接続し正しくテーブルが作られていれば OK.

### スタイルガイド

- 空白にはタブを使う
	- [Style Guide : CodeIgniter User Guide](https://ellislab.com/codeigniter/user-guide/general/styleguide.html#whitespace)


[Style Guide : CodeIgniter User Guide](http://www.codeigniter.com/user_guide/general/styleguide.html)


今日はこんなところで.

## Reference

- [coderwall.com : establishing geek cred since 1305712800](https://coderwall.com/p/gt_rfa)
- [RESTful Services with CodeIgniter | outergalactic.org](http://outergalactic.org/blog/restful-services-with-codeigniter/)
- [Building a RESTful Service using CodeIgniter | outergalactic.org](http://outergalactic.org/blog/building-a-restful-service-using-codeigniter/)