December 16, 2011

FuelPHPのcoreクラスを拡張してみる。

FuelPHP Advent Calendar 2011 16日目です。
@madmamor です。

先日の15日目は @eifuku さんの
cent osでのphp5.3環境のセットアップ with "yum" でした。


FuelPHPのcoreクラスを拡張したくなるケースは、色々と出てくると思います。
以前、Logクラスを拡張したので、そのまとめ的な内容です。

先に、ドキュメントは以下になります。
公式:
http://docs.fuelphp.com/general/extending_core.html
日本語:
http://press.nekoget.com/fuelphp_doc/general/extending_core.html



私がLogクラスを拡張した理由は2つ有ります。

(1) メソッド名の簡略化
Log::info は Log::i で呼び出したい。
Log::debug は Log::d で呼び出したい。
Log::warning は Log::w で呼び出したい。
Log::error は Log::e で呼び出したい。

(2) 非スカラー型(配列等)の変数も直接渡してログ出力したい。

となります。

早速、拡張したソースを掲載しても良いのですが、その前に。
そもそも、coreクラスがどこに有るのか。知っておいた方が良いはずです。

coreクラスはその名の通り、core/classesの中に有ります。
直下にはディレクトリとphpファイルがずらっと並んでいます。


14日目の @kenji_s さんの記事( FuelPHP の URL とコントローラの関係 )にある通り、
"クラス名の中の「_」はフォルダ区切りを意味する"
という決まり事があります。

ですので、ControllerクラスとController_Templateクラスはそれぞれ、以下のような配置になっています。
core/classes/controller.php
core/classes/controller/template.php

これを知っているだけでも、coreのソースを追いやすくなると思います。


では、Logクラス(core/classes/log.php)の拡張例を紹介してみます。



【例1】
クラス名をそのままにする場合。("コアクラスを拡張し、置き換える"場合。)

app/classes/log.phpを作成。
<?php

class Log extends Fuel\Core\Log
{
    public static function i($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::info($msg, $method);
    }
    public static function d($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::debug($msg, $method);
    }
    public static function w($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::warning($msg, $method);
    }
    public static function e($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::error($msg, $method);
    }
}

次に、app/bootstrap.phpを編集します。
以下のような箇所が有るはずなので
Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
));

ここに、今回作成したLogクラスを追加します。
Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
    'Log' => APPPATH.'classes/log.php',
));
これをしないと、先に作成したapp/classes/log.phpのLogクラスは無視されます。


使い方は、debugの場合
Log::d($msg);
となります。
Log::dの中で
if(!is_scalar($msg)) $msg = print_r($msg,true);
しているので、$msgは配列でも構いません。



【例2】
クラス名をMylog等としたい場合。("コアクラスを置き換えずに拡張する"場合。)その他は例1と同様。

app/classes/mylog.phpを作成。
<?php

class Mylog extends Fuel\Core\Log
{
    public static function i($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::info($msg, $method);
    }
    public static function d($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::debug($msg, $method);
    }
    public static function w($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::warning($msg, $method);
    }
    public static function e($msg, $method = null)
    {
        if(!is_scalar($msg)) $msg = print_r($msg,true);
        return parent::error($msg, $method);
    }
}

使い方は、debugの場合
Mylog::d($msg);
となります。
尚、この場合、app/bootstrap.phpの編集は不要です。



以上、coreクラスの拡張方法でした。



17日目は @mataga さんの
FuelPHP動作実験 - oil console & PHP Interactive改を使って マニュアルの例文コピペでいろんなメソッドを試してみよう☆彡
です。

No comments:

Post a Comment