Programmer

Make sites. But so slow.

Единообразие событий в Yii

Создатели Yii, при сравнении своего фреймворка с Zend или Simfony 2, не упускают шанса заявить, что гибкие фреймворки, для большинства проектов, являются оверинжинирингом, а вот Yii в самый раз.

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

Дана база данных, которую нужно разгрузить. Для этого мы используем самый простой вариант: репликация master-slave. На чтение отдаем реплику, а мастер работает на запись.

Не будь на сайте возможности регистрироваться и добавлять контент из админки – всё было бы действительно отлично, но это не наш случай. Нам нужно прозрачно перенаправить запись на master’а для всех моделей в системе. Вспоминаем, что в Yii есть события. И даже есть подходящие нам: beforeSave и afterSave.

Пункт про именование: при названии события before/afterSave, не ясно будет ли оно вызвано при использовании update и insert.

В вышеуказаных методах события срабатывают. А вот в saveAttributes – нет.

Понимаем, что красиво решить проблему behavior'ом не выйдет. Перекрываем CActiveRecord и начинаем искать методы которые не вызывают before/afterSave и используются в проекте. Находим updateByPk и saveCounters, не так уж много – перекрываем и их. Остается разобраться с delete, который добавляет: deleteByPk, deleteAll, deleteAllByAttributes.

О простоте. В Doctrine 2 это всё – prePersist, postPersist, preRemove, postRemove.

Tumblr

Долго метался между платформами для ведения блогов, и хотя идеологически мне ближе блог на собственном сервере, от этой идеи я отказался.

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

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