Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода?

Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? Отдельный очень важный момент. Снова сам попался на нём. Когда мы понимаем, что какую-либо функцию нам нужно вызывать во многих моделях, то надо её вынести в отдельный класс с общими функциями. Как правильно организовать наследование классов моделей в Yii?

Надо создать в папке models общую модель YiicoActiveRecord, которая расширяет CActiveRecord. И в неё поместить общую для всех наших моделей функцию(и). А эти все наши модели уже наследовать от YiicoActiveRecord, а не от СActiveRecord. (здесь видна аналогия с контроллерами: все контроллеры наследуются от Controller, который в свою очередь наследуется от CController, это и понятно и контроллеры и модели - суть классы).

Этот момент, что есть общий контроллер и можно сделать и общую модель, надо помнить. Бывает, можно не заметить и пихать в Controller функцию, а вызывать её в моделях - тогда, конечно Yii ругается, что не определён метод - он ждёт его в модели, а не в контроллере. Сам попался на этом на днях, поэтому рассмотрим на примере для нашего Yiico.

1. Небольшая косметическая поправка. Переназову базу данных из blog -> yiico, чтобы не возникало путаницы в базах, если у вас локально так же, как у меня стоит не одна база данных в MAMP или Denwer, кто в чём работает.

Php-функция NOW() возвращает дату в формате "2008-11-11 12:45:34",
time() — в числовом формате timestamp.
Наши посты хранят дату создания и изменения в формате timestamp сейчас. Оставим так, как есть. Пока нет причин менять тип поля на datetime.

2. Создадим в папке с моделями protected/models общий класс моделей - YiicoActiveRecord.php

<?php
abstract class YiicoActiveRecord extends CActiveRecord
{

protected function beforeSave()
{
if(parent::beforeSave())
{
if($this->isNewRecord)
{
$this->create_time=$this->update_time=time();
$this->author_id=Yii::app()->user->id;
}
else
$this->update_time=time();
return true;
}
else
return false; 
}

}
3. Теперь можно из модели Post.php убрать функцию beforeSave(), но расширять уже не класс CActiveRecord, а новосозданный класс YiicoActiveRecord
class Post extends YiicoActiveRecord
{
...

Это может пригодиться в будущем, если у нас будут другие модели, в которых сохраняются даты создания и изменения записей; не нужно будет в каждой создавать функцию beforeSave с одним кодом. Ну и может быть в общий класс ещё вынесем какие-то общие функции.

Проверьте, чтобы редактирование и создание нового поста работало после сделанных преобразований.

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

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:
  1. 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015) free
  2. 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015) free
  3. 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
  4. 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
  5. 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014) free
  6. 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014) free
  7. 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014) ← вы тут free
  8. 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013) free
  9. 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013) free
  10. 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013) free
  11. 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013) free
  12. 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014) free
  13. 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014) free
  14. 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013) free
Комментарии (1)     Подпишитесь на RSS комментариев к этой статье.

1 комментарий

#1013
SSDD говорит:
October 21, 2013 at 07:36 pm
Ждем продолжения 

Leave a Comment

Fields with * are required.

Картинка с кодом валидации
Пожалуйста введите символы с картинки. Регистр букв неважен.