Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Yii — обмен навыком: модели

Anna | 29.05.2014 | нет комментариев

Материал в данной статье предуготовлен для разработчиков, которые теснее имеют навыки работы с YII фреймворком. Опытным программистам материал может показаться неинтересным.
Статья написана для фреймворка версии YII 1.1.14. Под катом много текста с фрагментами кода.

Начнем

Как правило начинать построение моделей следует с проектирования таблиц исходя из поставленной задачи. Это интересное занятие мы оставим за рамками статьи, представим что у нас теснее есть требования к таблице. Модель строится теснее по готовой таблице, следственно начинать следует с миграции.

Миграции

При построении миграции следует чураться множества трудных зависимых запросов, по вероятности одна миграция должна создавать один SQL запрос. Давайте разглядим отчего это так.

Представим, что мы поддались соблазну и в одной миграции сотворили таблицу и индексы в ней. Тогда при опечатке в функции создания индекса миграция будет прекращена выброшенным прерыванием, и вторично запустить миграцию не получится так как таблица теснее сделана. Здесь если есть вероятность следует либо применять механизм транзакций, либо делать уйма мелких миграций.

Создание класса модели

Это занятие дозволено доверить генератору gii, он исполнит для Вас это с радостью. Впрочем позже генерации модели ее, как правило, нужно порядочно доработать.

Первое что делаем — меняем класс от которого наследуется модель. Если у Вас в каталоге application.components еще не существует файл ActiveRecord.php, то самое время его сделать, это будет базовый класс для всех наших моделей.

class ActiveRecord extends CActiveRecord
{
    const SCENARIO_CREATE = 'insert';
    const SCENARIO_UPDATE = 'update';
    const SCENARIO_SEARCH = "search";

    /** Return model ID
    *
    * @return integer
    */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Returns the static ActiveRecord model.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return ActiveRecord the static model class
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
}

В данный класс следует перенести все повторяющиеся способы из наследованных моделей для соблюдения DRY правила. Не забываем оставлять комментарии к способам с указанием директивы return, это не только для PHPDoc но и для IDE.

Также для комфорта написания кода в IDE сделаны константы с наименованиями сценариев, в этом случае автодополнение помогает избежать опечаток, исключительно когда сценариев становится крепко много (применяется как правило в валидации, но и не только).

Базовые модели

Если модель вышла дюже огромная и содержит уйма признаков такую модель комфортно разбить на две. Базовую модель и основную, наследованную от базовой.
Скажем цепочка наследования может иметь вид:
User -> BaseUser -> ActiveRecord -> CActiveRecord
При этом в базовую модель выносятся способы, нужные для работы YII (реляционные связи, правила проверок, метки признаков), а свои способы помещаем в стержневой класс модели.
В базовом и основном классе модели непременно исполнить переопределение статического способа model() как показано ниже. В комментарии к способу в теге return необходимо не позабыть указать свой класс.

    /**
     * Returns the static BaseUser model
     * 
     * @param string $className active record class name.
     * @return BaseUser
     */
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
Перевод наименований признаков

Отличная практика — привыкать к разработке с учетом международного интерфейса, для этого используем способ Yii::t(). В качестве категории дозволено указывать класс модуля либо компонента к которому принадлежит модель, к сожалению переопределять данный класс в модели неугодно, так как консольный парсер при построении словарей не будет знать категории (впрочем это допустимо, но тогда придется вызывать консольную команду с дополнительной конфигурацией).

        /**
         * @return array customized attribute labels (name=>label)
         */
        public function attributeLabels()
        {
            return array(
                'id' => Yii::t('BaseUser','ID'),
                'firstName' => Yii::t('BaseUser','First Name'),
                'middleName' => Yii::t('BaseUser','Middle Name'),
                'lastName' => Yii::t('BaseUser','Last Name'),
                'phone' => Yii::t('BaseUser','Phone Number'),
                'email' => Yii::t('BaseUser','E-mail'),
                // and more...
            );
        }

Подобно способу attributeLabels() необходимо создавать и свои, скажем для полей ранга statusLabels. Это сгодится при построении выпадающих списков на форме.

Константы в моделях

Константы нужно применять для полей ранга записи, флаговых полей (битовые маски), полей прогресса и т.д. А именно для тех полей по которым ведется индексация и значение там сжато и не видимо.

    const STATUS_DRAFT  = 1;
    const STATUS_PUBLIC = 1;
    const STATUS_TRASH  = 1;

    const FLAG_HAS_CAR = 1;
    const FLAG_HAS_HOUSE = 2;
    const FLAG_HAS_CREDIT = 4;
    const FLAG_HAS_DEPOSIT = 8;

Видимо, что встречая такие константы в исходниках они нам сразу говорят с чем мы имеем дело.

Способы доступа к данным

При разработке моделей, нужно применять геттеры и сеттеры и не применять чтение признаков и присвоение им значений напрямую. Это даст разработчикам больший контроль над растяжением плана. Сеттер может делать тихую фильтрацию при установке значения, либо приведение типа данных, а геттер может форматировать выходные данные в комфортном формате. Сеттер должен только присваивать значение признаку, но не должен делать сохранение модели. Если сеттер будет возвращать $this, то таким образом дозволено строить текучий интерфейс для модели, для геттера это безусловно неприменимо.

    /**
     * Set user status
     *
     * @param int $status
     * @return \User
     */
    public function setStatus(int $status){
        $this->status = $status;
        return $this;
    }

    /**
     * Return First Name
     *
     * @return string  
     */
    public function getFirstName()
    {
        return (string)$this->upperFirst($this->firstName);
    }
Мелкие операции

Изредка над моделью производятся мелкие операции над небольшим числом признаков, такие способы дозволено начинать с префикса make и такие способы могут исполнять сохранение модели внутри себя, а также выбрасывать события для навешивания обработчиков.

    /**
     * Make user active
     *
     * @return bool
     */
    public function makeActive(){
       if($this->hasEventHandler('onBeforeCount')){
            $this->onBeforeCount(new CEvent($this));
       }

        $result = $this->setStatus(self::STATUS_ACTIVE)
             ->save();

        if($this->hasEventHandler('onAfterMakeActive')){
			$this->onAfterMakeActive(new CEvent($this));
        }
        return $result;
    }

На этом вероятно прервусь, Дабы узнать суждение аудитории.

Мне продолжать статьи обмена навыком по разработке на YII?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Проголосовало 17 человек. Воздержалось 6 человек.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB