Cellard
Новичок
Господа, прошу вашей помощи в реализации правильной архитектуры модели.
Пусть есть класс, реализующий модель ActiveRecord. Его задача — читать и писать в таблицу базы данных, без каких-либо изысков.
Покажу только методы, которые важны для повествования:
Допустим, мы хотим хранить в этой таблице дерево. Для того, чтобы расширить модель, мы обернем ActiveRecord классом NodeExt, в котором и будут реализованы «древесные» методы.
Дерево реализовано на Nested Sets, а это значит, например, что добавление (и удаление и т.д.) записи происходит в несколько запросов. Рассмотрим удаление.
После того, как запись будет удалена, мы должны будем обновить какие-то другие записи в таблице, отталкиваясь от свойств удаленной записи (а именно от правого и левого ключей, но это не столь важно).
Важно то, что мы хотим сделать это наиболее прозрачным для программиста способом, то есть ничего внешне не меняя:
Как этого можно добиться?
Ну, конечно же, в классе NodeExt у нас есть метод afterDelete, который все эти дополнительные запросы выполнит, но кто его вызовет?
Можно научить класс Entity видеть свой интерфейс iNode и дергать из метода delete этот специальный метод класса NodeExt — но это противоречит конституции — отвергаем.
Нужно доверить программисту переопределение метода delete, но как нам заставить программиста это сделать?
Ну и наконец, вдруг случится чудо, и вы подскажете мне законный способ решения задачи, такой, чтобы программисту и не нужно было бы ничего дополнительно делать...
Пусть есть класс, реализующий модель ActiveRecord. Его задача — читать и писать в таблицу базы данных, без каких-либо изысков.
Покажу только методы, которые важны для повествования:
PHP:
class Entity extends arEntity {
public function __construct($id) {}
public function delete() {}
}
$o = new Entity(3); // Запрашиваем из базы запись к ключом 3
$o->delete(); // И удаляем ее
PHP:
class Entity extends arEntity implements iNode {
public function Node()
{
return new NodeExt($this);
}
}
$o = new Entity(3); // Запрашиваем из базы запись к ключом 3
$o->Node()->getParent(); // И получаем ее родителя
После того, как запись будет удалена, мы должны будем обновить какие-то другие записи в таблице, отталкиваясь от свойств удаленной записи (а именно от правого и левого ключей, но это не столь важно).
Важно то, что мы хотим сделать это наиболее прозрачным для программиста способом, то есть ничего внешне не меняя:
PHP:
$o = new Entity(3); // Запрашиваем из базы запись к ключом 3
$o->delete(); // Удаляем ее и перестраиваем дерево
Ну, конечно же, в классе NodeExt у нас есть метод afterDelete, который все эти дополнительные запросы выполнит, но кто его вызовет?
Можно научить класс Entity видеть свой интерфейс iNode и дергать из метода delete этот специальный метод класса NodeExt — но это противоречит конституции — отвергаем.
Нужно доверить программисту переопределение метода delete, но как нам заставить программиста это сделать?
Ну и наконец, вдруг случится чудо, и вы подскажете мне законный способ решения задачи, такой, чтобы программисту и не нужно было бы ничего дополнительно делать...