NYCPHP Meetup

[nycphp-talk] How to make a model/database accessible to different parts/classes of the application

Dell Sala dell at sala.ca
Wed Aug 29 20:40:24 EDT 2007


> [...] my second attempt was to create a singleton, but the problem  
> is that my model needs configuration data in order to be  
> instantiated correctly. So whenever I would call the getInstance 
> (...) method I need to have the model's configuration data  
> available as I can't always be sure that the getInstance method has  
> been called before and an instance of the model class already exists.

> [...] I wanted to create a Registry class, add my model to it and  
> access it from whatever method I want. This however makes unit  
> testing harder and has all the site effects which global variables  
> have.

Sounds like you might find some answers in reading about Dependency  
Injection. I've come across this recently, and it's helped my  
thinking around some of these issues. http://www.martinfowler.com/ 
articles/injection.html I think the key here is the concept of the  
"container". It's like a class configuration registry.

There was also a good article about Dependency Injection in a recent  
php|architect issue:
http://www.phparch.com/issue.php?mid=82

The idea of implementing a generic container seemed a little overkill  
for most of what I was doing. I've found myself using static methods  
to configure a class (rather than a singleton), and I place my  
configuration code in a bootstrap file. For example, the bootstrap  
file might look something like:

require_once 'Proj/SomeModel.php';

Proj_SomeModel::configure(array(
    'option1' => 'some value',
    'option2' => 'another value',
));

The boostrap could either be a global one, or one that could be  
required only when I knew I was going to work with the model. The  
model object would then access these static config values within the  
constructor when instantiating itself. Using a model becomes a simple  
as:

require_once 'model-bootstrap.php';

$model = new Proj_SomeModel();

Don't know if this is helpful, or just rehashing things you've  
already tried. Care to share more details about what you've tried so  
far?

-- Dell






More information about the talk mailing list