2016-10-20 8 views
0

usr_firstnameという名前の属性にsetterメソッドsetUsr_firstnameを使用して、属性のデータ変換を実行しようとしています。Yii2:カスタム設定メソッド/データ変換がActiveRecordで機能しませんか?

class User extends ActiveRecord implements IdentityInterface { 

    public function rules() { 
     return [ 
      [['usr_firstname', 'usr_lastname', ... ], 'required'], 
      ... 
     ]; 
    } 

    ... 

    public function setUsr_firstname($value) { 
     $this->usr_firstname = fix_wrong_title_case($value); 
    } 
} 

その後、私は次のようにします。

$model = new User(['scenario' => User::SCENARIO_REGISTER]); 
$model->usr_firstname = 'John'; 

しかし、セッターメソッドが呼び出されることはありません!私はメソッドのすべての種類の名前を付けてみました - 例えば。 setUsrFirstname - 何も動作しません。これをどのように機能させるには?

UPDATE

は、属性名にアンダースコアの有無にかかわらず、任意のActiveRecordの属性では動作しません考え出しました。

+0

このように、メソッド 'public function setUsrFirstname($ value){$ this-> usr_firstname = fix_wrong_title_case($ value); } 'を呼び出して' $ model-> setUsrFirstname( 'John');のように呼び出すと動作しません。 – Bizley

+0

@Bizleyいいえ、私はセッターメソッドを直接呼び出すのではありません - それはYiiのデータ変換のポイントです。 'usr_firstname'属性がシステムの任意の場所で変更されると、Yiiはsetterメソッド' setUsr_firstname'を自動的に呼び出し、それをモデル/オブジェクトに設定する前に値を実行します。 – TheStoryCoder

+1

これは、直接宣言されたプロパティまたはアクティブレコード属性の場合(アンダースコア付きかどうかにかかわらず)には機能しません。 – Bizley

答えて

2

直接またはアクティブレコード属性(アンダースコア付きかどうかに関係なく)で宣言されたプロパティの場合、セッターメソッドは呼び出されません。

アクティブレコードの魔法__setメソッドは、マップされた属性に直接値を割り当てます。

あなたは、新しい仮想属性と同じような何かを達成することができます。だから今あなたが好きそれを使用することができます

public function setUsrFirstname($value) 
{ 
    $this->usr_firstname = doSomethingWith($value); 
} 

public function getUsrFirstname() 
{ 
    return $this->usr_firstname; 
} 

を:

$this->usrFirstname = 'John'; 
echo $this->usrFirstname; 

あなたはARあなたのライフサイクルに属性を変更したい場合

  • 、検証中にそれを変更する FilterValidatorを使用:することができます
  • オーバーライドDBは、フェッチした後、それを変更するには、モデルのafterFind()方法、
  • DBに保存する前にそれを変更するオーバーライド・モデルのbeforeSave()方法は、
  • 直接呼び出されるメソッドを準備
  • 、上記のすべてのことを行うことができます行動を準備それはそれを変更します(これには最初のセッターメソッドを使用できます。 validate()clearErrors()に電話する必要はありません)。