2016-10-20 2 views
0

Я пытаюсь преобразовать данные по атрибуту, используя метод setter setUsr_firstname для атрибута, который называется usr_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 Нет, я не называю метод setter напрямую - вот в чем смысл преобразования данных Yii. Каждый раз, когда атрибут 'usr_firstname' изменяется в любом месте системы, Yii должен автоматически вызывать метод setter' setUsr_firstname' и запускать значение до этого, прежде чем устанавливать его в модели/объекте. – TheStoryCoder

+1

Это не работает в случае свойств, объявленных непосредственно или атрибутов Active Record (независимо от того, имеет ли это знак подчеркивания или нет). – Bizley

ответ

2

Метод Setter не вызывается в случае свойств, объявленных непосредственно или атрибутов Active Record (независимо от того, имеет ли это знак подчеркивания или нет).

Магия Active Record __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 изменить его в процессе проверки,
  • переопределение afterFind() метод модели, чтобы изменить его после того, как DB выборки,
  • beforeSave() метод отменяют модели, чтобы изменить его перед сохранением в БД,
  • подготовить поведение, которое может сделать все вышеуказанные вещи,
  • подготовить метод, который будет вызываться напрямую что изменит его (вы можете использовать для этого первый метод сеттера; нет необходимости звонить validate() и clearErrors()).
Смежные вопросы