Web Developer's Struggle Memories

日々の業務から思ったこと、学んだことを書き連ねていきます。

Codeigniter小ネタ集

CodeIgniter Advent Calendar 2015の19日目の投稿です。

Codeigniter(ver 3.0.1)を使い始めて約3週間経ちましたが、色んな記事を見ていて「これ良いな」とか、 「これは活用させてもらおう」と思ったネタを集めました。対象は初心者です。 経験者の方は大体知ってるものかと思いますので、ご了承ください。

必須事項

まずはやるべき事一覧。

  • index.phpのリダイレクト
  • index.phpの設定
<?php
define('ENVIRONMENT', 'development'); // 環境毎に変更
  • デフォルトコントローラ(ページ)の設定
    application/config/routes.phpを編集。
<?php
$route['default_controller'] = 'top';
  • ログ出力設定
    application/config/config.phpを編集
<?php
$config['log_threshold'] = 2;

環境によるDBの切り分け

デフォルトだとapplication/config/database.phpにてDBの接続設定を行うが、これだと本番用・テスト用も共有する形となるので不便。 これを環境毎に設定ファイルを作成し、設定するように変更。(これも必須事項に入れても良いかな)

フォルダ構成はこうなる。

application/
└── config/
     ├── development/        ... 開発環境用
     │      └──database.php
     ├── testing/        ... テスト環境用
     │      └──database.php
    └── production/        ... 本番環境用
             └──database.php

あとはそれぞれのdatabase.phpにてDB接続設定を書いて、index.phpでどの環境かを指定すれば良い。

トータルクエリ数の取得

画面描画やバッチ処理などの最後に記述すると、それまでに実行したクエリの数を取得できるメソッド。ちょっと処理が遅かったときに、クエリ周りを調査するのに役に立ったので記載。

<?php
echo $this->db->total_queries();

言語(japanese)ファイルの追加

デフォルトの設定application/config/config.phpだと、

<?php
$config['language'] = 'english';

のように英語になっており、各種エラー文言やアラートの文言が英語になっている。 日本国内向けの何かを作るのであれば、やっぱり日本語(japanese)にしたいので設定する。(他の言語も同様の方法で設定可能)

  • config.phpの設定を変更
<?php
$config['language'] = 'japanese'; // 変更したい言語に変更

- 言語周りの設定ファイルの複製

$ cp -R system/language/english/ system/language/japanese/

全てのファイルを複製する必要はないが、とりあえず全部複製し、必要なものを編集する形でも良いかと。

- 各設定ファイルを編集 system/language/japanese/***-lang.phpの中身が全て英語になっているので日本語(各言語)のものに編集する。


※2016/01/06更新
kenjisさんに「言語ファイルは本家で翻訳を配布していますので、特別な理由がない限りそれを使うのがよいと思います。」とご指摘いただきました。

  • 本家から各言語の翻訳ファイルを取得

上記のリンクはjapaneseの翻訳ファイル。
これをzipでダウンロードし、解凍、system/language/japanese/ディレクトリにアップする。(application/language/japanese/でも良い)または、下記コマンドから各言語の翻訳ファイルを一括で取得する方法もある。

$ cd /path/to/codeigniter
$ php bin/install.php translations develop

ただし、このコマンドだとapplication/language/ディレクトリに本家のdevelopブランチの言語ファイルがコピーされるので注意。(参考記事

以上で設定完了。

コマンドラインから実行

バッチやマイグレーション、特定のメソッドなどをブラウザなどからHTTPリクエストからは実行したくないとき、以下を追記すれば制御できる。 クラス全体で制御したい場合は、__construct()メソッドに記述すれば良い。

<?php
if ( !$this->input->is_cli_request() ) {
   return FALSE;
}

バリデーションの追加

フォームのバリデーションで、独自のバリデーションを追加したい場合の方法を記載。 例えば、18日目の記事(自分のものですみません)でも記載したが、 Codeigniterの標準のバリデーションには日時のバリデーションが実装されていないようなので、本投稿では日付のバリデーションを追加。

ネイティブライブラリの拡張(継承)を参考に、 application/libraries/MY_Form_validation.phpを作成し、以下を記述。

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Form_validation extends CI_Form_validation {
    public function __construct()
    {
        parent::__construct();
    }

   /**
    * Valid Date
    *
    * @param   string
    * @return  bool
    */
   public function valid_date($str)
   {
      // 日付の区切り文字を'/'に変更
      $str = preg_replace('/\/|-|\.| /', '/', $str);

      // 日付を年月日で分離
      $ymd = explode('/', $str);

      // 日付の正確性チェック
      if (!checkdate($ymd[1], $ymd[2], $ymd[0])) {
         return FALSE;
      }

      return TRUE;
    }
}

余談

基本的にはユーザガイドがしっかりしているので、たいていの事はここを見れば事足りる。(insert_string, update_stringやなるものがある事を知らずに頑張ってクエリメソッドを自前で作っていた。。。反省) が、実際に現場で使ってみたご意見などを見ないと分からない・触れることがないものも多々ある。 色んな方の記事を見て知識を得て、活用できるものは活用し、良いプロダクトを作っていきたい。

※また何かあれば追記します。