Это нормально для модели, чтобы заполнить ее собственные свойства? - PullRequest
0 голосов
/ 27 сентября 2011

Если у меня есть модель, которая по существу представляет одну строку в базе данных, является ли она масштабируемой и удобной для тестирования, и все ли в порядке, если она заполняет свои собственные свойства или ее свойства вводятся, так же, как вы вводите объект?

Пример:

Class blog {
    $id;
    $title;
    $body;

    public function load($id) {
        // db query to load id, title, body
    }
}

OR

Class blog {
    $id
    $title
    $body
}

// load blog data into $data, and then...

$blog = new Blog($data)

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

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

Тем не менее, если бы вы были намерены сделать что-то вроде $ model-> load ($ id) и получить его из источника данных, вы могли бы получить что-то вроде:

class Model {
    private $_dataProvider;

    // inject data-provider dependency in constructor
    public function __construct($dataProvider){
        $this->_dataProvider = $dataProvider;
    } 

    public function loadById($id){
        $myData = $this->_dataProvider->loadDataById($id);
        $this->setFoo($myData['foo']);
        ...
    } 
}

Внедрив класс доступа к данным, вы можете передать макет для тестирования или заменить базу данных каким-либо веб-сервисом или чем-то еще.Пока у $ dataProvider есть метод loadDataById (), который принимает целое число и возвращает соответствующую структуру данных, у вас все хорошо.

Лично я предпочитаю, чтобы мои модели были хорошими и фокусировались на представлении того, чем они являются 'пере моделирование.Я полагаюсь на внешние классы обслуживания и репозитории для загрузки данных, внедрения их в модели и их возврата.

1 голос
/ 27 сентября 2011

Если вы хотите отделить слой хранилища данных от самих моделей, вы должны сделать его инъекционным.

Если модели являются абстракцией хранилища данных, вам не нужно заботиться, вы тольконужно внедрить модели, которые затем должны иметь определенные интерфейсы, чтобы вы могли тестировать остальную часть своего приложения.

Но это зависит только от ваших потребностей и вашего дизайна.

...