What is the best practice for adding persistence to an MVC model?
| From: | Eric Bauman | Date: | Tue, 27 Oct 2009 06:27:07 +0000 |
| Subject: | What is the best practice for adding persistence to an MVC model? | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-299365@lists.php.net to get a copy of this message | ||
I'm in the process of implementing an ultra-light MVC framework in PHP. It seems to be a common opinion that the loading of data from a database, file etc. should be independent of the Model, and I agree. What I'm unsure of is the best way to link this "data layer" into MVC.
I've considered a few options:
*Datastore interacts with Model*
//controller
public function update()
{
$model = $this->loadModel('foo');
$data = $this->loadDataStore('foo', $model);
$data->loadBar(9); //loads data and populates Model
$model->setBar('bar');
$data->save(); //reads data from Model and saves
}
*Controller mediates between Model and Datastore*
Seems a bit verbose and requires the model to know that a datastore exists.
//controller
public function update()
{
$model = $this->loadModel('foo');
$data = $this->loadDataStore('foo');
$model->setDataStore($data);
$model->getDataStore->loadBar(9); //loads data and populates Model
$model->setBar('bar');
$model->getDataStore->save(); //reads data from Model and saves
}
*Datastore extends Model*
What happens if we want to save a Model extending a database datastore to a flatfile datastore?
//controller
public function update()
{
$model = $this->loadHybrid('foo'); //get_class == Datastore_Database
$model->loadBar(9); //loads data and populates
$model->setBar('bar');
$model->save(); //saves
}
*Model extends datastore*
This allows for Model portability, but it seems wrong to extend like this. Further, the datastore cannot make use of any of the Model's methods.
//controller extends model
public function update()
{
$model = $this->loadHybrid('foo'); //get_class == Model
$model->loadBar(9); //loads data and populates
$model->setBar('bar');
$model->save(); //saves
}
Any input on the "best" option - or alternative - would be most appreciated.