LoginSignup
7
3

More than 5 years have passed since last update.

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

Posted at

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が更新されなくなります。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3