Псевдоним Zend Framework 2 DI, одно и то же имя контроллера в разных модулях

У меня есть приложение с 3 модулями и конфигурациями маршрутов, как показано ниже:

  • admin.domain.tld/[:controller[:/action]] => Администратор
  • rest.domain.tld/[:controller[:/id]] => Остальные
  • domain.tld/[:controller[:/action]] => Сайт

и установите псевдоним DI для всех контроллеров в каждом модуле

Псевдоним модуля REST DI:

'alias' => array(
    'index' => 'Rest\Controller\IndexController',
    ...
),

Псевдоним административного модуля DI:

'alias' => array(
    'index' => 'Admin\Controller\IndexController',
    ...
),

Псевдоним DI модуля сайта:

'alias' => array(
    'index' => 'Site\Controller\IndexController',
    ...
),

Как видите, некоторые контроллеры имеют одинаковые имена (например: IndexController), но поскольку zf2 объединил конфигурацию с поведением LIFO, псевдоним 'index' всегда из последнего добавленного модуля.

Конфигурация приложения

'modules' => array('Rest','Admin', 'Site'),

когда я получаю доступ к http://admin.domain.tld/, я ожидаю, что index псевдоним дает Admin\Controller\IndexController, но поскольку модуль сайта ( зарегистрирован последним) имеет тот же псевдоним для index, что дает Site\Controller\IndexController

Как использовать другой псевдоним DI для соответствия одному и тому же имени контроллера?


person Komang    schedule 14.04.2012    source источник
comment
Можете ли вы опубликовать некоторые из ваших configs/DI?   -  person Gabriel Santos    schedule 14.04.2012
comment
Я обновляю вопрос, чтобы показать вам конфигурации псевдонимов DI для каждого модуля и регистрации конфигурации модулей приложений.   -  person Komang    schedule 15.04.2012
comment
См. конфиги с веб-сайта Akrabat: akrabat.com/zend- framework-2/ он генерирует роутеры для каждого модуля, а не alias.   -  person Gabriel Santos    schedule 15.04.2012
comment
@Gabriel, спасибо, чего я хочу добиться, так это использовать комплексную маршрутизацию вместо добавления отдельного маршрута для каждого контроллера, но, по словам Мэтью, они работают над per-module solutions, а до тех пор лучшим решением является использование конкретного маршрутизатора для каждого.   -  person Komang    schedule 16.04.2012
comment
Akrabat выполняет помодульную работу.   -  person Gabriel Santos    schedule 16.04.2012
comment
@Gabriel, правда, но с определенной маршрутизацией для каждого контроллера, а не с универсальной маршрутизацией, как я сказал здесь, это точно так же, как Jurian ответ ниже.   -  person Komang    schedule 17.04.2012


Ответы (1)


Прежде чем новый слой представления был объединен с основным, для корректного поведения контроллеров требовалось наличие псевдонимов при разрешении сценариев представления. Теперь этого больше не требуется, даже не рекомендуется больше использовать псевдонимы для контроллеров. Проблема с псевдонимами заключается в том, что для одного FQCN существует один псевдоним, поэтому ваша проблема напрямую связана с этим.

Что вам нужно сделать, так это удалить псевдонимы из конфигурации DI и вместо этого использовать явные маршруты. «Волшебный» маршрут [:controller[/:action]] — это плохая практика, которая приводит к большему количеству проблем, чем может вам помочь. Поэтому напишите несколько явных маршрутов и удалите псевдонимы.

person Jurian Sluiman    schedule 15.04.2012
comment
спасибо за ваш ответ, почему-то мне больше нравится описанный выше подход, который довольно хорошо работает в текущем приложении с zf1, здесь я просто хочу преобразовать его в zf2. Каждый модуль имеет много контроллеров, и я не хочу писать кучу конфигураций маршрутизации для каждого из них. Я думаю, было бы хорошо, если бы модуль поддержки DI изолировал конфигурацию или даже псевдоним префикса - person Komang; 15.04.2012
comment
@Komang Я только что записал, что рекомендуется и предложенный способ. Волшебного маршрута пока нет, но будет тот, который подходит для вашего варианта использования. Вы можете столкнуться с коллизиями в именах маршрутов, и это будет не самый быстрый метод, но он может быть простым для процессов RAD. Вы также можете по-прежнему использовать сегментированные маршруты с необязательными сегментами для действий и других параметров, вам не нужно полностью указывать все точки маршрута. Однако для контроллеров не используйте псевдонимы, если вы хотите, чтобы ваши приложения были модульными. - person Jurian Sluiman; 15.04.2012
comment
еще раз спасибо, Мэтью также предлагает тот же подход, поэтому в этом случае нет другой подсказки, чтобы сохранить всеобщую маршрутизацию :/controller. ~ будет один, который охватывает ваш вариант использования ~ есть предложение для этого? - person Komang; 15.04.2012
comment
@Komang нет предложения, но есть история на доске AgileZen: agilezen.com/project/ 33552/история/24. Там можно отслеживать изменения. Если у вас еще нет учетной записи на agilezen.com, вы также можете просмотреть обзор на framework.zend. com/zf2/доска - person Jurian Sluiman; 15.04.2012