Содержание
Yii содержит два базовых класса для моделей:
- yii\base\Model — для моделей, не связанных с таблицами БД, модель формы
- yii\db\ActiveRecord — производный от первого, для моделей, связанных с таблицами БД
Класс Model
Атрибуты (Attributes)
Атрибуты это публичные поля модели. Для моделей, напрямую наследующих Model, все публичные поля как раз и становятся атрибутами. Если в модели переопределить метод attributes(), в нем можно задать иной порядок определения атрибутов. Например, в ActiveRecords атрибутами являются поля из связанной таблицы, при этом их не нужно объявлять как публичные свойства модели.
К атрибутам можно получить доступ как к свойствам объекта, как к элементам массива, а так же перебрать в цикле.
Attribute Labels
Каждому атрибуту можно задать метку — более красивое название вместо его имени. Метод модели getAttributeLabel(“name”) вернет метку для атрибута name.
По умолчанию метки генерируются автоматически из имен атрибутов: имя разбивается на отдельные слова по заглавным буквам. Отвечает за это метод generateAttributeLabel(), который можно переопределить и задать иной механизм автогенерации.
Вместо автоматически сгенерированных можно задать свои метки для каждого атрибута. Для этого надо переопределить метод attributeLabels(), который должен вернуть ассоциативный массив атрибут=>метка.
Правила валидации (Validation Rules)
Правила валидации полей модели можно задать переопределив метод rules():
1 2 3 4 5 6 7 8 9 10 11 12 13 | class EntryForm extends Model { public $name; public $email; public function rules() { return [ [['name', 'email'], 'required'], ['email', 'email'], ]; } } |
Вызвав в action’е метод модели validate() можно проверить выполнение этих правил для модели. Метод вернет true, если модель валидна, или false, если модель содержит ошибка. Так же в случае ошибок метод validate() установит свойство модели hasErrors в false. Сам ошибки можно получить в виде массива вызвав getErrors():
1 2 3 4 5 6 | if ($model->validate()) { // Валидна } else { // Не валидна // Ошибки: $model->getErrors() } |
Класс ActiveRecord
Производный от Model.
С таблицей в БД линкуется автоматически: название класса должно совпадать с названием таблицы. Можно переопределить эту связь в методе tableName (static, должен возвращать строку с именем таблицы)