PHP
FuelPHP
ORM
observer

FuelPHPのORMのObserverを一時的に無効にする方法

More than 1 year has passed since last update.

FuelPHPのModelはModelの内容が更新されたらupdated_atに自動でシステム日付を入れるという機能があります。
ModelにObserverを設定することでこれを実現しているのですが、一時的にObserverを無効にしてupdated_atの自動更新をやめたい場合があります。

その場合、unregister_observer メソッドを使ってObserverを無効にすることができます。

例えばモデルExampleが以下のように定義されていたとします。

model/example.php
<?php

class Model_Example extends \Orm\Model_Soft
{
    protected static $_properties = array(
        'id',
        'name',
        'count',
        'created_at',
        'updated_at',
        'deleted_at',
    );
    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => true,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_update'),
            'mysql_timestamp' => true,
        ),
    );
    protected static $_soft_delete = array(
        'deleted_field' => 'deleted_at',
        'mysql_timestamp' => true
    );

    protected static $_table_name = 'examples';
}

この場合モデルのsaveメソッドで更新すると、モデルのプロパティが変更されていた場合
Observerが自動でupdated_atに値を設定します。

これを何らかの事情でupdated_atを更新したくない場合、以下のように

    $model = Model_Example::find($id);
    $model->unregister_observer('Orm\Observer_UpdatedAt');`
    $model->count += 1;
    $model->save();

unregister_observer メソッドの引数に一時的に無効にしたいObserver名を指定して実行すると
Observerが無効になり、この場合saveメソッドで更新してもupdated_atが更新されなくなります。