Может ли модель содержать ссылку на меппер/репозиторий?

Духовность™

Продвинутый новичок
В общем, вопрос вот в чем: как вы считаете, хорошим ли тоном является впрыскивать в модель (entity) ссылку на меппер, т.е. на объект, который занимается выборкой из СУБД? И делать вот такие методы:

PHP:
class Group {
    // описание модели и т.д.

    public function __construct(mapperManager $mapperManager) {
        $this->mapperManager = $mapperManager;
    }

    public function getUsers() 
    {
        if ($this->users == null) { // lazy load
            $this->users = $mapperManager->getMapper('User')->findAll();
        }
Я так понимаю, что доктрина фактически тоже самое делает и запрос к СУБД через Lazy Load делается зачастую в самом шаблоне!

Как считаете, это тру или не тру? Или модель должна быть пассивна как овощ и ничего не знать о базе, и уж тем более не содержать ссылку на слой, оперирующий с базой?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Оффтоп, конечно, но: почему я никогда не понимаю, что ты пишешь? Неужели так сложно писать по-русски, а не на этом странном пиджине?
 

AmdY

Пью пиво
Команда форума
Духовность™
а почему ты работаешь с мэппером User, а не моделью
PHP:
        if ($this->users == null) { // lazy load
            $users = new Model_User();
            $this->users = $users->findAll();
        }
 

Koc

Новичок
думаю, что в энтити лучше не впрыскивать менеджера. А вот создать какой-то слой типа сервиса и в него впрысныть менеджер можно
 

tz-lom

Продвинутый новичок
ИМХО:
каждый слой должен оперировать понятиями себя и соседних слоёв
модель оперирует данными или моделями
поэтому я согласен с мыслью AmdY если тебе нужен lazyLoad
а если не нужен - сразу впрыскивай пользователя
как третий вариант можно сделать ленивую проксю
 

Духовность™

Продвинутый новичок
Оффтоп, конечно, но: почему я никогда не понимаю, что ты пишешь? Неужели так сложно писать по-русски, а не на этом странном пиджине?
не понял, ты про что?

Духовность™
а почему ты работаешь с мэппером User, а не моделью
PHP:
        if ($this->users == null) { // lazy load
            $users = new Model_User();
            $this->users = $users->findAll();
        }
не понял вопроса. Меппер у меня занимается запросами к базе и построением объектов. Модель - это просто класс с набором параметров, гет/сет методы и логика домена. В эту модель я и хочу впрыскивать мепперы, что бы делать Lazy Load.

думаю, что в энтити лучше не впрыскивать менеджера. А вот создать какой-то слой типа сервиса и в него впрысныть менеджер можно
Мне в шаблоне нужно сделать
foreach ($model->getCollection() as $collection)
сервис тут вообще никак не поможет. Сервис по сути - это отдельный слой, выполняющий определенную бизнес-логику.
 

Gas

может по одной?
Или модель должна быть пассивна как овощ и ничего не знать о базе
ну вроде моделькам принято уметь

$model->attribute = value;
$model->save();

здесь без ссылки на мапер уже никак.
 

Духовность™

Продвинутый новичок
ну вроде моделькам принято уметь

$model->attribute = value;
$model->save();
Не принято. Точнее, не всегда. Это - Active Record. Я же говорю про модель и меппер.

Модель у меня - это вот что: http://pastebin.com/vGVRDpG9

Чисто овощь, обладающий маленькой логикой домена. А вот методы isUser() и isAdministrator() в этом коде инстанцируют мепперы. Теперь я переделываю, впрыскивая в модель менеджер Мепперов и хочу разобраться, насколько это правильно.
 

Yaroslav PHPDev

Новичок
Мне кажется модель должна оставаться как можно чище, и не должна знать ни о БД, ни о других службах.
Думаю правильней создать отдельно маппер, который будет принимать вашу модель, и записывать ее в БД например.
В данном случае модель остается чистой. Маппер содержит в себе адаптер, который умеет работать с Базой.
PHP:
$user = new User();
$user->setName('Yaroslav');
$user->setSex('M');

$userMapper = new UserMapper($user);
$userMapper->save();
 

rotoZOOM

ACM maniac
А вот методы isUser() и isAdministrator() в этом коде инстанцируют мепперы.
Это конечно удобно свалить, все методы работы с юзером в модель, но может данную проверку возложить на плечи какого-нибудь Acl?
Сразу исчезнет потребность в знании мэппера моделью.
 
Сверху