2012-03-08 4 views
3

私は現在、save()が呼び出される前にオブジェクトにさまざまなものを追加する必要があるリチウムアプリケーションを開発中です。理想的にはリチウムジェネリックモデルフィルタ

私は次のようなモデルクラス(他のモデルを拡張し、ベースモデル)に適用するフィルタを書くことができるようになります

Model::applyFilter('save', function($self, $params, $chain) { 
    // Logic here 
}); 

これは可能ですか?もしそうなら、それはブートストラップされたファイルでしょうか?

答えて

5

私はあなたが言っている誤解ないよ場合は、あなたがしたいフィルタに、例えば、保存する前にオブジェクトに 'created'または 'modified'の値を自動的に追加します。

ここで私はそうしています。

extensions/data/Model.php

<?php 
namespace app\extensions\data; 
use lithium\security\Password; 

class Model extends \lithium\data\Model { 

    public static function __init() { 
     parent::__init(); 

     // {{{ Filters 
     static::applyFilter('save', function($self, $params, $chain) { 
      $date = date('Y-m-d H:i:s', time()); 
      $schema = $self::schema(); 

      //do these things only if they don't exist (i.e. on creation of object) 
      if (!$params['entity']->exists()) { 

       //hash password 
       if (isset($params['data']['password'])) { 
        $params['data']['password'] = Password::hash($params['data']['password']); 
       } 

       //if 'created' doesn't already exist and is defined in the schema... 
       if (empty($params['date']['created']) && array_key_exists('created', $schema)) { 
        $params['data']['created'] = $date; 
       } 
      } 

      if (array_key_exists('modified', $schema)) { 
       $params['data']['modified'] = $date; 
      } 
      return $chain->next($self, $params, $chain); 
     }); 
     // }}} 
    } 
} 

?> 

から私はそこにもハッシングいくつかのパスワードを持っています。機能に影響を与えずに削除することができます。

4

フィルタは継承*をサポートしていません。

OOPを使用し、オーバーライドされたsave()メソッドを持つBaseModelクラスを持ち、そこからすべてのアプリケーションモデルを継承する方がよいでしょう。

他の方法では、ブートストラップファイル内の各モデルにフィルタを遅延適用することができます。たとえば:$timestamp閉鎖

Filters::apply('app\models\Documents', 'save', $timestamp); 
Filters::apply('app\models\Queries', 'save', $timestamp); 
Filters::apply('app\models\Projects', 'save', $timestamp); 

*継承がplannedではなく、まだimplemented