RE: What is the best practice for adding persistence to an MVC model?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Eric,

IMO, controllers shouldnt be responsible for interacting models and datastoreres. Controllers might only change the datastore class of a model.

You may use your models in lots of controller functions. Defining datastore in all controllers seems not a good practice. (too much unneccessary codes written)

A simple example

//controller
Public function doItController()
{
        $user = new user();
        // $user->setDataStorer(new anotherDataStorer());   // this is optional if you want to change models datastorer
        $user->loadUserFromId(1);
}

// model
Class user
{
        Protected $_dataStorer = null;

        Public function loadUserFromId($id = 0)
        {
                // codes codes codes
                $result =       $this->getDataStorer()->query("select .....");
                // codes codes codes
        }

        // codes codes codes
        Public function getDataStorer()
        {
                if(null == $this->_dataStorer)
                        $this->_dataStorer = new myVeryBestDataStorer();
                return $this->_dataStorer;
        }

        Public function setDataStorer($newStorer)
        {
                $this->_dataStorer = $newStorer;
        }
}


Hope it will be usefull and understandable

-----Original Message-----
From: Eric Bauman [mailto:baumane@xxxxxxxxxxxxxx]
Sent: Tuesday, October 27, 2009 8:27 AM
To: php-general@xxxxxxxxxxxxx
Subject:  What is the best practice for adding persistence to an MVC model?

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.

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


Bu mesaj ve ekleri, mesajda gönderildiği belirtilen kişi/kişilere özeldir ve gizlidir. Size yanlışlıkla ulaşmışsa lütfen gönderen kisiyi bilgilendiriniz ve mesajı sisteminizden siliniz. Mesaj ve eklerinin içeriği ile ilgili olarak şirketimizin herhangi bir hukuki sorumluluğu bulunmamaktadır. Şirketimiz mesajın ve bilgilerinin size değişikliğe uğrayarak veya geç ulaşmasından, bütünlüğünün ve gizliliğinin korunamamasından, virüs içermesinden ve bilgisayar sisteminize verebileceği herhangi bir zarardan sorumlu tutulamaz.

This message and attachments are confidential and intended for the individual(s) stated in this message. If you received this message in error, please immediately notify the sender and delete it from your system. Our company has no legal responsibility for the contents of the message and its attachments. Our company shall have no liability for any changes or late receiving, loss of integrity and confidentiality, viruses and any damages caused in anyway to your computer system.


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux