Я построил «модельный» суперкласс для инфраструктуры MVC. В большинстве методов мне нужно только имя класса, поэтому я использовал get_called_class (), но для методов сохранения и редактирования мне нужно передать объект со значениями.
В моем дизайне, когда вы создаете модельный объект и сохраняете или редактируете его, вы должны сделать:
$object->save($object);
или же $object->update($object, $id).
Мне действительно не нравится это, потому что выглядит как плохой дизайн. Я хотел бы просто сказать:
$object->save(); and $object->update($id);
Так как вы эффективно сохраняете текущий объект.
Классы Models расширяют родительский объект Model, который определяет их поведение и создает для них соединение с БД.
Методы суперкласса, которые я хотел бы создать, не принимают в качестве аргумента $ object, а скорее я хотел бы сказать «получить вызывающий объект».
public function save($object) {
return self::$db->save($object);
}
public function update($object,$id) {
return self::$db->update($object, $id);
}
Я знаю, что это может быть легко выполнимо в объектной модели с
public function save () {
parent::save($this);
}
Но я бы не хотел переопределять это поведение для каждой модели!
Заранее спасибо.
Использование любой существующей библиотеки ORM здесь не обсуждается, так как я хочу предоставить построитель запросов и простой ORM, основанный на PDO по умолчанию. Потому что я не хочу иметь какую-либо стороннюю зависимость по умолчанию
Определите вашу базовую модель как абстрактный класс и наследуйте поведение по умолчанию от дочерних классов модели.
abstract class Model
{
public function save() {
return self::$db->save($this);
}
public function update($id) {
return self::$db->update($this, $id);
}
}
class UserModel extends Model;
$myModel = new UserModel();
$myModel->save();
Других решений пока нет …