僕なりの Codeigniter3 備忘録

# Install

```bash
$ curl -L https://github.com/bcit-ci/CodeIgniter/archive/3.1.11.zip > CodeIgniter.zip
$ unzip CodeIgniter.zip
$ mv CodeIgniter-3.1.11/* .
$ rm -r CodeIgniter-3.1.11 CodeIgniter.zip
```





# Setting



## language

> https://codeigniter.jp/user_guide/3/libraries/language.html



```php
# config/config.php
$config['language']	= 'japanese';
```



`language/japanese/`に以下のURLでダウンロードできる、必要そうなものを配置する。

https://github.com/bcit-ci/codeigniter3-translations/tree/develop/language/japanese





## db

### connecting to MySQL8

- `mysqli`ドライバーを使用する時の設定

    - `dsn`の設定をしない
    - `dbdriver`の設定
    - `char_set`、`dbbcollat`の設定を `utf8mb4`にする

    ```php
    # config/database.php
    
    $db['default'] = array(
        'dsn'    => '',
        'hostname' => 'localhost',  // または対象のホスト名またはIPアドレス
        'username' => 'your_username',  // MySQLユーザー名
        'password' => 'your_password',  // MySQLパスワード
        'database' => 'your_database_name',  // 使用するデータベース名
        'dbdriver' => 'mysqli',  // MySQL Improvedを使用
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8mb4',  // utf8mb4を推奨。4バイトのUnicodeもサポート。
        'dbcollat' => 'utf8mb4_general_ci',  // 同上
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );
    ```

- `pdo`ドライバーを使用する時の設定

    - `dsn`の設定が必要
    - `dbdriver`の設定
    - `char_set`、`dbbcollat`の設定を `utf8mb4`にする

    ```php
    # config/database.php
    
    $db['default'] = array(
        'dsn'   => 'mysql:host=localhost;dbname=your_database_name;charset=utf8mb4',  // DSNの形式で設定します
        'hostname' => '',  // dsnで指定しているため空にします
        'username' => 'your_username',  // MySQLユーザー名
        'password' => 'your_password',  // MySQLパスワード
        'database' => '',  // dsnで指定しているため空にします
        'dbdriver' => 'pdo',  // dbdriverをpdoに設定
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8mb4',  // utf8mb4を推奨。4バイトのUnicodeもサポート。
        'dbcollat' => 'utf8mb4_general_ci',  // 同上
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );
    ```



MySQL 8.0のデフォルトの認証プラグイン`caching_sha2_password`は多くのPHPのPDOバージョンでサポートされていない。そのため、MySQLユーザーが`mysql_native_password`を使用するように設定する必要がある。

```mysql
# 確認
SELECT user, host, plugin FROM mysql.user;

# 変更
alter user 'ユーザー'@'ホスト' identified with mysql_native_password by 'パスワード';
```



# Validation

> https://codeigniter.jp/user_guide/3/libraries/form_validation.html



## handling dual field

```php
# config/validation.php

// 手数料のバリデーションはコールバック関数を用いて実装
array(
    'field' => 'commission_rate',
    'label' => '手数料率 (実質年率)',
    'rules' => 'callback_commission_rate_check',
),
// 手数料のバリデーションが掛かった時、背景を赤くするために以下2つのフィールドを設定
array(
    'field' => 'commission_rate1',
    'label' => '手数料率（整数）',
    'rules' => '',
),
array(
    'field' => 'commission_rate2',
    'label' => '手数料率（小数）',
    'rules' => '',
),
```

```php
# controller

function get_errors()
{
    $results = array();
    $fields = array();
    $results['all'] = validation_errors();

    if ($this->CI->session->userdata('error')) {
        $results['all'] .= $this->CI->session->userdata('error');
        $this->CI->session->unset_userdata('error');
    }


    foreach ($this->rules as $rule) {
        $results[$rule['field']] = form_error($rule['field']);

        if (form_error($rule['field'])) {
            $fields[] = $rule['field'];
        }
    }

    // エラーの時に背景を赤くするための実装。
    if (!empty($results['commission_rate'])) {
        $fields[] = 'commission_rate1';
        $fields[] = 'commission_rate2';
    }

    $results['fields'] = implode(',', $fields);
    return $results;
}
```







# Model

> https://codeigniter.jp/user_guide/3/general/models.html



## basic

```php
# config/autoload.php

$autoload['libraries'] = array(
    'database', //これを書く
);
```

```php
# Controller

$this->load->model("model_name");
$this->model_name->method();
```

```php
# Model

function method()
{
    $query = $this->db->get('user');
    return $query->result();
}
```



## built-in function

- `result()`

    結果全部をオブジェクトで返す。

    アクセス方法

    ```php
    $aaa->xxx
    ```

- `result_array()`

    :結果全部を配列で返す

    アクセス方法

    ```php
    $aaa['bbb'];
    ```

- `row()`

    1行をオブジェクトで返す

- `row_array()`

    1行を配列で返す





# Library



## service

### how to create

そもそもアーキテクチャがMVCだからcontrollerのように

```php
class Xxx extends CI_Controller {
  
}
```

のようにできない。従って、CIの core functions を使いたい時は以下のようにCIのインスタンスを`get_instance()`で作ってあげる必要がある。

```php
class Yyy_service
{
 	 	private $CI;
  
  	public function __construct()
  	{
    	$this->CI &= get_instance();
    	$this->CI->load->model([
      		'user_model',
    	]);
  	}
}
```



## image

> https://codeigniter.jp/user_guide/3/libraries/image_lib.html



### setting of Imagemagick

imagimagickは開発環境では`/usr/bin`に居る。本番環境では`/usr/local/bin`に居る。確認コマンドは

```bash
$ convert -version
```

上のどこかにはいるので、そのパスを下記

```php
'library_path' => '/usr/bin',
```

に記述する。

```php
$resize_config = [
    'image_library' => 'imagemagick',
    'library_path' => '/usr/bin',
    'source_image' => $data['full_path'],
    'quality' => 50,
    'file_permissions' => 0777,
];
```

あと、php.iniのに下記を書いて上げることでラップできてインストールしなくても使える？

```ini
; Provides a wrapper to the ImageMagick library.
extension_dir=/usr/local/lib/php70/20151012/ ←ここ
extension=imagick.so
```



# Template Parser

> https://codeigniter.jp/user_guide/3/libraries/parser.html



改行判定

- 半角空白を入れる

- 以下のコードを入れる

    ```php
     <?php echo "\n"; ?>
    ```



# Test

> https://codeigniter.jp/user_guide/3/libraries/unit_testing.html



## using php unit test

`application/tests`を作成

```php
# application/tests/ExampleTest.php

<?php
    
class ExampleTest extends PHPUnit_Framework_TestCase
{
    public function testTrueIsTrue()
    {
        $this->assertTrue(true);
    }
}

```

```bash
vendor/bin/phpunit application

PHPUnit 5.7.27 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 10 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
```





# Deploy

## toggle CI_ENV

`.htaccess`を使う

```bash
# /.htaccess
SetEnvIf Host "^localhost"        CI_ENV=development
SetEnvIf Host "^(www.)?hoge.com"   CI_ENV=production
```