localdisk

PHP とか Java とか Web とか好きなことを書きます。

CodeIgniterで簡単メンテナンスモード

なにかしらWebサービスを作成して継続していくならメンテナンスモードの作成は必須になると思います。とはいえこういった機能にあまり時間をかけたくないですよね。CodeIgniterなら簡単にメンテナンスモードを作成できます。

フック

CodeIgniterにはフック機能というのがありまして、フレームワークの要所々々でコアをハックすることなくフレームワークの動作を変更できます。今回はこの機能を利用してメンテナンスモードを作成します。

application/config/config.php

<?php
$config['enable_hooks'] = TRUE; // フック機能を有効にする
$config['maintenance'] = TRUE; // メンテナンスモードを有効にする場合はTRUE
$config['maintenance_view'] = 'maintenance'; // メンテナンスモードで表示させるViewファイル

application/config/hooks.php

<?php
$hook['pre_system'] = array(
    'class'    => 'Maintenance',
    'function' => 'maintenance',
    'filename' => 'Maintenance.php',
    'filepath' => 'hooks',
);

上記のように書くとpre_system(システムの実行の最初)に application/hooks(filepath)/Maintenance.php(filename) の Maintenance(class) クラスの maintenance(function) がコールされます。

application/hooks/Maintenance.php


とのことですので EXT を .php に修正しました。

<?php
class Maintenance {
    public function maintenance() {
        $config = load_class('Config', 'core');
        if ($config->item('maintenance') === TRUE) {
            include APPPATH . 'views/' . $config->item('maintenance_view') . '.php';
            exit();
        }
    }
}

余談ですが、フックを作成する上で注意することを述べておきます。CodeIgniterで機能を拡張する際、一番使用頻度が高い関数 get_instance ですが使用できるタイミング的には post_controller_constructor 以降になります。それ以前のポイントでフックを作成する場合は get_instance を使用しないように注意して下さい。 上記コードで include を使用しているのは CI_Loader->view が get_instance を使用しているためです。

application/view/maintenance.php

<!DOCTYPE HTML>
<html lang="ja-JP">
    <head>
        <title>maintenance</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>maintenance</h1>
    </body>
</html>

最後に View を作成。これで終了です。簡単ですね。
今回の内容も CI Utility Package に含まれています。興味のある方はご覧ください。