February 12, 2012

FuelPHPのORMパッケージを拡張してみる。

先に、ソースは
https://github.com/mp-php/fuelphp-packages-myorm
にUPしてあります。

--

created_atやupdated_atと同じノリで、created_ipとupdated_ipの保存をする
独自ORMパッケージを作成してみました。
created_ipとupdated_ipの型はvarcharで、長さは適当で良いかと。

以下、手順です。

fuel\packages下に"myorm"ディレクトリを作成。
"myorm"ディレクトリの中に、以下の3ファイルを作成。
fuel\packages\myorm\bootstrap.php
fuel\packages\myorm\classes\observer\createdip.php
fuel\packages\myorm\classes\observer\updatedip.php

各ファイルは、以下の内容になります。

fuel\packages\myorm\bootstrap.php
<?php
Autoloader::add_classes(array(
    'MyOrm\\Observer_CreatedIp' => __DIR__.'/classes/observer/createdip.php',
    'MyOrm\\Observer_UpdatedIp' => __DIR__.'/classes/observer/updatedip.php',
));


/* End of file bootstrap.php */


fuel\packages\myorm\classes\observer\createdip.php
<?php
namespace MyOrm;

class Observer_CreatedIp extends \Orm\Observer
{
    public static $property = 'created_ip';
    protected $_property;

    public function __construct($class)
    {
        $props = $class::observers(get_class($this));
        $this->_property = isset($props['property']) ? $props['property'] : static::$property;
    }

    public function before_insert(\Orm\Model $obj)
    {
        $obj->{$this->_property} = \Input::real_ip();
    }
}

// End of file createdip.php


fuel\packages\myorm\classes\observer\updatedip.php
<?php
namespace MyOrm;

class Observer_UpdatedIp extends \Orm\Observer
{
    public static $property = 'updated_ip';
    protected $_property;

    public function __construct($class)
    {
        $props = $class::observers(get_class($this));
        $this->_property = isset($props['property']) ? $props['property'] : static::$property;
    }

    public function before_save(\Orm\Model $obj)
    {
        if ($obj->is_new() or $obj->is_changed())
        {
            $obj->{$this->_property} = \Input::real_ip();
        }
    }
}

// End of file createdip.php


このパッケージを使用するためにはapp/config/config.phpのalways_loadのpackagesに追加する必要があります。
'packages'  => array(
    'orm',
    'myorm',
),

myormを使用するということは、まず間違いなくormも使用するはずなので、
この2つを有効にして下さい。

Modelの$_observersは以下のようになります。
protected static $_observers = array(
    'Orm\Observer_CreatedAt' => array('events'=>array('before_insert'), 'mysql_timestamp' => true,),
    'Orm\Observer_UpdatedAt' => array('events'=>array('before_save'), 'mysql_timestamp' => true,),
    'Orm\Observer_Validation'=> array('events'=>array('before_save')),
    // MyOrm
    'MyOrm\Observer_CreatedIp'=>array('events'=>array('before_insert')),
    'MyOrm\Observer_UpdatedIp'=>array('events'=>array('before_save')),
);

"// MyOrm"の行以下が、今回の話と関係しています。

これで、標準ORMパッケージに依存しつつ、完全に分離できたので
思う存分、ORMに独自の機能を追加できそうです。

No comments:

Post a Comment