Организация загрузки модели...

cDLEON

Онанист РНРСlub
Организация загрузки модели...

В общем такой вопрос, знатоки.
Мне хотелось бы передать в модель подключение к БД, конфиг-контроллеры, и т.д.
Решил воспользоваться фабрикой... Но... Орагизация моделей бывает разной.. Например - модель может быть всё той же фабрикой... Ну что то вроде file::eek:pen() etc...
Т.е. при перекидывании инициализации (new file) - передать все ссылки на объекты в конструктор нельзя будет... К тому же не очень хочется забивать конструктор кучей параметров, что бы потом для каждой модели эти параметры копипастить при переопределении конструктора....
Что посоветуете?
 

Духовность™

Продвинутый новичок
Эмулировать каким-нибудь Rigistry GLOBALS-ы. Все равно от зависимостей никуда не деться.
 

whirlwind

TDD infected, paranoid
я контексты использую

-~{}~ 21.11.09 15:53:

PHP:
interface IModelContext
{

    function getConnection();
    function getMappersRegistry();
    function getValidator();
    function getCurrentUser();
    function hasCurrentUser();

}

abstract class AND_DataMapper extends DataMapper
{
    protected $context,$observable;

    function __construct(IModelContext $context)
    {
        parent::__construct($context->getConnection());
        $this->context = $context;
        $this->observable = $this->createObservable();
    }

...
 

Lightning

Трудоголик
Т.е. при перекидывании инициализации (new file) - передать все ссылки на объекты в конструктор нельзя будет..
Почему нельзя? Можно: file::eek:pen(ссылки);
К тому же не очень хочется забивать конструктор кучей параметров, что бы потом для каждой модели эти параметры копипастить при переопределении конструктора....
Не хочется забивать кучей параметров, забивай одним параметром. "Замена списка аргументов объектом" называется.
 

Beavis

Banned
если для всех моделей подключение к БД одно и тоже, можно в базовом классе модели создать просто статическое свойство, где хранить объект для работы с БД, и соотв-но не надо будет каждый раз передавать этот объект в новую модель через конструктор
 

whirlwind

TDD infected, paranoid
Beavis а можно сделать глобальную переменную и
не надо будет каждый раз передавать этот объект в новую модель через конструктор
Более гибко - инжектить все необходимое при инстанцировании в фабрике. Фабрика одна, а порождаемых ею типов неограниченно много.
 

cDLEON

Онанист РНРСlub
Lightning
Не хочется забивать кучей параметров, забивай одним параметром. "Замена списка аргументов объектом" называется.
Тогда либо геттеры, либо параметры нужно будет делать публичными... В случае, если передовать объект самого контроллера...
whirlwind
А вот контексты это что по-ближе... Только в любом случае - для фабрик нужно будет воротить нечто вроде:
PHP:
class file {
 protected function __construct(IModelContext $context) {
 }
 static public function open(IModelContext $context,$file) {
  $obj=new self($context);
 };
}
Чего делать не хотелось бы... Тогда смысла от фабрики в виде
PHP:
$this->load_model('file');
ну уж очень мало ))) Фактически - только инклуд файла с классом этой модели )))
Хотелось бы сделать как можно проще и без копи-паста.... 8)))

-~{}~ 21.11.09 16:39:

Более гибко - инжектить все необходимое при инстанцировании в фабрике. Фабрика одна, а порождаемых ею типов неограниченно много.
Именно этого я и хочу добиться 8)))
Только для случая когда модель реализована как фабрика, такой вариант не подходит(
 

whirlwind

TDD infected, paranoid
Во-первых, объясни что значит - модель реализована как фабрика, лично я не понимаю.
Во-вторых, не вижу в чем проблема

инжектить все необходимое при инстанцировании в фабрике. Фабрика одна, а порождаемых ею типов неограниченно много.

Именно этого я и хочу добиться 8)))
но допускаю, что это из-за того, что во-первых.

-~{}~ 21.11.09 16:52:

PS. вообще в ооп основной смысл - выносить все то, что меняется чаще чем все остальное в экземпляры, используя один шаблон. То есть, у тебя есть потребность инстанцировать модель с разными аргументами конструктора. Значит следует декларировать шаблон, который позволяет это сделать, не заморачиваясь на том, какие конкретно аргументы передаются в конструктор. Иначе говоря, создать абстракцию - интерфейс для инстанцирования. А затем, используя этот интерфейс, программировать все остальное, что не зависит от конкретного аргумента или аргументов. Но так как в этом и есть смысл фабрики, то самый короткий путь - это модифицировать фабрику, то есть сделать то, что тебя смущает. Но короче вряд-ли получится. Если я не прав, орбязательно отпиши варианты ;)
 

cDLEON

Онанист РНРСlub
Во-первых, объясни что значит - модель реализована как фабрика, лично я не понимаю.
Я же привёл пример:
PHP:
file:: open('filename.ext');
file:: create('filename.ext');
В итоге получаем объект типа file, но уже инициализированный как нужно... Т.е. инициализация объекта осуществляется через статические методы.
А затем, используя этот интерфейс, программировать все остальное, что не зависит от конкретного аргумента или аргументов.
Нууу, хочется упростить логику и дальнейший рефакторинг - убрать, хоть и мелкий, но копи-паст...
 

whirlwind

TDD infected, paranoid
Если у тебя аргументы одинаковые, то копипаст у тебя будет только из-за статики? Мое личное мнение по этому поводу можно узнать через поиск по моим сообщениям на этом форуме.
 

cDLEON

Онанист РНРСlub
whirlwind
нет. Ты меня не правильно понял 8)
Я хотел сказать, что кроме аргумента filename.ext туда ещё нужно будет передавать контекст с коннектами к БД, конфигами и прочей байдой. А хотелось бы это зашить в фабрику по загрузке модели )
 

whirlwind

TDD infected, paranoid
Вот я и говорю: есть контекст модели, есть контекст http-запроса... Мысль ясна?
 

kode

never knows best
Re: Организация загрузки модели...

Автор оригинала: cDLEON
В общем такой вопрос, знатоки.
Мне хотелось бы передать в модель подключение к БД, конфиг-контроллеры, и т.д.
Решил воспользоваться фабрикой... Но... Орагизация моделей бывает разной.. Например - модель может быть всё той же фабрикой... Ну что то вроде file::eek:pen() etc...
Т.е. при перекидывании инициализации (new file) - передать все ссылки на объекты в конструктор нельзя будет... К тому же не очень хочется забивать конструктор кучей параметров, что бы потом для каждой модели эти параметры копипастить при переопределении конструктора....
Что посоветуете?
Через массив параметров, либо куча сеттеров
 

pilot911

Новичок
можно передавать значения в функцию через ассоциативный массив - это самое простое решение

тогда не надо париться с разными интерфейсами и тп
 

Активист

Активист
Команда форума
>Мне хотелось бы передать в модель подключение к БД, конфиг-контроллеры, и т.д.
Чем синглтон та не угадил? Если у тебя везде объекты, инициализируй все объекеты в сингтоне, а потом, доступ осущевствляй доступ типа sington::getInctance()->dbObjec->query(); или в конструкторе создавай клон или ссылку инициализированного объекта, осущевствляя доступ через sington::getInctance()->...

> что бы потом для каждой модели эти параметры копипастить при переопределении конструктора....
А наследование? чем не угодило?

Или я чего-то не вкурил))
 

cDLEON

Онанист РНРСlub
Активист
синглтон не угодил тем, что у меня разные объекты для той же БД могут использоваться.
А наследование? чем не угодило?
при переопределении конструктора....
-~{}~ 28.11.09 11:52:

Пока что решил как говорил whirlwind....
Тем самым отказавшись от инициализаций модели через статические методы класса....
 
Сверху