Хороший модельный класс для mvc, отслеживающий свойства - PullRequest
3 голосов
/ 16 ноября 2011

Вот мой класс model_users («модель», из которой он расширяется, еще ничего не имеет - все еще пытается работать над подготовкой этой модели и затем абстрагировать общие функции для использования с другими моделями), Database::query просто возвращает mysql_fetch_assoc() результата:

class Model_User extends Model {    
    private static $_table = 'users';

    public function __construct($properties = array())
    {
        parent::__construct();
        foreach ($properties as $key => $value) {
            $this->{$key} = $value;
        }
    }

    public function exists()
    {
        return ($this->id) ? TRUE : FALSE;
    }

    public static function get_by_id($id = NULL)
    {
        if ($id)
        {
            $result = Database::query(
                sprintf('SELECT * FROM ' . self::$_table . ' WHERE id = %d', $id)
            );

            return new Model_User($result);
        }
        else
        {
            return new Model_User(array());
        }
    }

    public function save()
    {
        return TRUE;
    }
}

Это позволяет мне сделать что-то вроде:

$u = Model_User::get_by_id(5);
        if ($u->exists())
        {
            echo $u->name;
            echo $u->id;
        }
        else
        {
            echo 'No user';
        }

Я пытаюсь научиться использовать модели без orm или чего-либо подобного (я использовал их раньше, но я хочу научиться делать их простые версии).

Мне интересно, как отслеживать свойства модели абстрактным способом, я видел объект отражения php, и это может быть тем, что мне нужно. Я просто хочу иметь возможность делать такие вещи, как:

$u = new Model_User();
$u->name = 'John';
$u->email = 'john@example.com';
$u->save();

или как

$u = Model_User::get_by_id(2);
$u->email = 'someone@example.com';
$u->save();
// Different than the prior one since it would UPDATE, not INSERT

Я не спрашиваю, как реализовать весь метод save(), но мне нужно знать, как думать об этом таким образом, чтобы можно было иметь класс абстрактной модели, который прост в использовании. Один из барьеров, которые мне нужно преодолеть, состоит в том, что есть два типа свойств: один тип является фактическим свойством модели (в данном случае «имя» или «электронная почта»), а другой тип связан с другими вещами, такими как как «имя таблицы» или, может быть, даже «имеет много» информации об отношениях.

1 Ответ

3 голосов
/ 16 ноября 2011

Один ответ: метаданные.

Вам необходимо отслеживать некоторые данные о ваших данных.

Если вы хотите, чтобы ваши db-столбцы отображались как открытые свойства простой модели в вашей модели (и вы не хотите углубляться в магию _ get () / _set () stuff), вам нужно вести список, где-то, какие свойства должны быть прочитаны / записаны из / в БД.

Вы могли бы иметь что-то вроде;

<?php
class User extends Model {
    public $dbcols = array(
        'id',
        'name',
        'email'
    );
}

Затем метод save () проверит $ this-> dbcols, чтобы выяснить, о каких данных нужно беспокоиться. В приведенном выше примере метод update () будет выполнять что-то вроде:

function update(){
    $updates = array();
    foreach($this->dbcols as $name){
        $updates[$name] = "'{$this->escape($this->$name))}'";
    }
    $sql = "UPDATE {$this->tableName} SET " . implode(',',$updates) . " WHERE id={$this->id}";
    ...
}

Конечно, вы можете сделать $ dbcols ассоциативным массивом и иметь разные идентификаторы для ваших свойств и имен столбцов, добавлять правила проверки или экранирования и, в конечном итоге, все усложнять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...