====== Расширение поведения базового класса lmbActiveRecord ====== lmbActiveRecord представляет 2 базовых способа расширять свое поведение: - Путем расширения шаблонных методов ([[wp>Template_method_pattern]]), которые внедрены в различные метода методов save() и destroy(). Этим методом могут пользоваться дочерние классы - Путем регистрации случашелей (event listeners) на различные события, которые происходят в методах save() и destory(). Этим могут пользоваться клиенты объектов %%ActiveRecord%%. ===== Перекрытие шаблонных методов ===== lmbActiveRecord содержит различные пустые шаблонные методы, которые дочерние классы могут перекрывать чтобы расширить поведение родительского класса (в скобках указаны публичные метод, где они вызываются): * (destroy) _onBeforeDestroy(); - вызывается до удаления объектов связей has_one, has_many и связей has_many_to_many * (destroy) _onAfterDestroy(); - вызывается после удаления записи из базы данных * (save) _onBeforeSave(); - вызывается после того, как будут сохранены объекты связей has_one и many_belongs_to * (save) _onBeforeUpdate(); - вызывается перед валидацией данных, в случае, если объект был загружен (процесс обновления записи - UPDATE) * (save) _onUpdate(); - вызывается после валидации перед непосредственным изменением записи в базе данных * (save) _onAfterUpdate(); - вызывается после изменения записи в базе данных * (save) _onBeforeCreate(); - вызывается перед валидацией данных, в случае, если объект еще не был сохранен (процесс создания новой записи - INSERT) * (save) _onCreate(); - вызывается после валидации перед непосредственным созданием записи в базе данных * (save) _onAfterCreate(); - вызывается после создания записи в базе данных * (save) _onAfterSave(); - вызывается перед сохранением объектов связей has_many, has_many_to_many и belongs_to. Порядок и количество шаблонных методов является тестовым и еще окончательно не определенным. Если у вас появляются сложности или предложения, касающиеся этому вопросы - обращайтесь к разработчикам. ===== Регистрация слушателей на объекты ===== lmbActiveRecord позволяет регистрировать слушатели на определенные события, которые в настоящее время соответствуют шаблонным методам, которые мы указали выше. Регистрация слушателя производится путем вызова метода вида registerOn_XXX_Callback($object, $method), где _XXX_ - тип события, $object - слушатель, а $method, название метода, который будет вызываться объектом %%ActiveRecord%% при оповещении. В $method приходит в качестве параметра сам объект %%ActiveRecord%%. Например: class Document extends lmbActiveRecord { [...] } class SomeController extends lmbController { function doSomeAction() { $document = new Document($document_id); $document->registerOnUpdateCallback($this, 'processDocumentUpdate'); [...] $document->save(); } function processDocumentUpdate($document) { [... do something special with document] } } Слушатели удобны в том случае, когда объекты %%ActiveRecord%% обрабатываются группой объектов по цепочке и логика по обработке достаточно сильна распределена по классам. Список методов, которые позволяют подписаться на соответствующие события (в скобках указаны публичные метод, где они вызываются): * (destroy) registerOnBeforeDestroyCallback(); - событие генерируется до удаления объектов связей has_one, has_many и связей has_many_to_many * (destroy) registerOnAfterDestroyCallback(); - событие генерируется после удаления записи из базы данных * (save) registerOnBeforeSaveCallback(); - событие генерируется после того, как будут сохранены объекты связей has_one и many_belongs_to * (save) registerOnBeforeUpdateCallback(); - событие генерируется перед валидацией данных, в случае, если объект был загружен (процесс обновления записи - UPDATE) * (save) registerOnUpdateCallback(); - событие генерируется после валидации перед непосредственным изменением записи в базе данных * (save) registerOnAfterUpdateCallback(); - событие генерируется после изменения записи в базе данных * (save) registerOnBeforeCreateCallback(); - событие генерируется перед валидацией данных, в случае, если объект еще не был сохранен (процесс создания новой записи - INSERT) * (save) registerOnCreateCallback(); - событие генерируется после валидации перед непосредственным созданием записи в базе данных * (save) registerOnAfterCreateCallback(); - событие генерируется после создания записи в базе данных * (save) registerOnAfterSaveCallback(); - событие генерируется перед сохранением объектов связей has_many, has_many_to_many и belongs_to. !! Обратите внимание, что слушатели оповещаются после вызыва соответствующего шаблонного метода.