Модели ZF2, совместно используемые модулями


Я только что начал настраивать новое приложение ZF2 для нового проекта, основанного на скелете ZF2, и просматриваю их учебник по моделям .

Tl;dr: как я должен разделить модель между несколькими различными модулями, поместив ее где-нибудь на более высоком уровне (вне /модуля)?

У нас есть несколько модулей, настроенных следующим образом:

/
/module/ModuleName
/module/ModuleName/config
/module/ModuleName/src
/module/ModuleName/src/ModuleName

Я как раз собирался настроить папку /module/ModuleName/src/ModuleName/Model/TableName.php, но потом понял: к этой таблице нужно будет обращаться в других модулях, как хорошо. Так что же мне делать?

Должен ли я поместить папку Models в /module/Model или это приведет к тому, что она будет рассматриваться как модуль, т. Е. site.com/model (основываясь на нашей текущей конфигурации, это было бы).

Должен ли я копировать и вставлять модели между местами? Должен ли я вставить модели обратно в /vendor/library/Company/Model где-нибудь? Не совсем уверен, есть ли для этого лучшая практика!

Вопрос 2: В учебном пособии также предлагается использовать ServiceManager для создания экземпляров моделей баз данных для использования одного и того же экземпляра. Что если у меня есть модуль с 5 контроллерами, каждый из которых имеет доступ к совершенно отдельным таблицам (скажем, по 4 таблицы в каждой)? Мне кажется, что это приведет к избыточной инициализации 16 таблиц при каждой загрузке страницы (для других контроллеров в этом модуле). Инициализация одной таблицы добавляет 55 мс к загрузке страницы. Есть ли способ обойти это?? Я не уверен, как бы я перенес конфигурацию в действия контроллера, основываясь на том, что делает учебник для инициализации tablegateway?

Author: tereško, 2013-02-26

1 answers

1)

Вы можете использовать любую модель из любого модуля в своем приложении, чтобы они могли быть "общими". Для примера вы используете ServiceManager, чтобы помочь вам захватить экземпляры моделей (и других классов) в вашем проекте.

Конфигурация диспетчера служб:

'factories' => array(
    'AuthService' => function($sm) {
        $auth = new \Zend\Authentication\AuthenticationService();

        return $auth;
    },
    'RoleMapper' => function($sm) {
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        $mapper = new \Application\Mapper\RoleMapper;
        $mapper->setDbAdapter($dbAdapter);
        $mapper->setEntityPrototype(new \Application\Model\Role);
        $mapper->setHydrator(new \Application\Model\RoleHydrator);

        return $mapper;
    },
    'UserMapper' => function($sm) {
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
        $mapper = new \MyModule\Mapper\UserMapper;
        $mapper->setDbAdapter($dbAdapter);
        $mapper->setEntityPrototype(new \MyModule\Model\User);
        $mapper->setHydrator($sm->get('UserHydrator'));

        return $mapper;
    },
    ....

Как вы можете видеть, там могут быть определены классы из нескольких модулей. Обычно вы просто определяете отдельную конфигурацию ServiceManager для каждого модуля.

Ничто не мешает вам сделать экземпляр "Usermapper" внутри вашего прикладного модуля выглядит следующим образом:

Некоторый контроллер:

$this->getServiceLocator()->get('UserMapper');
// Or even grab Zend libraries like this
$this->getServiceLocator()->get('AuthService');

ServiceManager позволит вам захватывать экземпляры классов из любого из ваших модулей внутри любого из других с проблемой.

2)

Диспетчер служб фактически не создает экземпляр чего-либо, пока вы не запросите его, поэтому никаких накладных расходов, как вы предлагаете, нет.

Из приведенного выше примера, на самом деле не создано никаких экземпляров, пока вы сначала не попросите один:

$this->getServiceLocator()->get('UserMapper'); // instance now created.

Если вы никогда не попросите менеджера службы, например, "Сопоставитель ролей", то экземпляр не будет создан.

 8
Author: Andrew, 2013-02-26 08:48:32