Zend Framework не может маршрутизировать переведенные дочерние маршруты

Я новичок в Zend Framework 3 и пытался перевести маршруты, и мне это частично удалось. Я могу перевести основной маршрут и перенаправить его в нужное место, но для дочерних маршрутов перевод работает, но перенаправление — нет. не могли бы вы помочь мне, мой код ниже.

module.config.php

'router' => [
'router_class'           => TranslatorAwareTreeRouteStack::class,
'routes' => [
'setting' => [
'type'    => Segment::class,
'options' => [
'route' => '/{locale}/{setting}',

'defaults' => [
'locale'     => 'de',
'controller' => Controller\SettingController::class,
'action'     => 'index',
],
],

'may_terminate'=>true,
'child_routes' =>[
'add' =>[
'type'      =>'Segment',
'options'   =>[
'route'         =>'/{add}',
'defaults'=> [
'controller' => Controller\SettingController::class,
'action'     => 'add',
],
],
],
],
],
],
],

module.php

   public function onBootstrap(MvcEvent $e)
{
$eventManager        = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);

$language_session = new Container('language');

if(!$language_session->offsetExists('lang')){

$language = 'de_DE';

} else{

$language = $language_session->lang.'_'.strtoupper($language_session->lang);
}

$translator = $e->getApplication()->getServiceManager()->get('translator');
$translator->setLocale($language);
$translator->addTranslationFile('phparray', __DIR__.'/language/'.$language.'.php', 'default',$language);

$app      = $e->getTarget();
$app->getEventManager()->attach('route', array($this, 'onPreRoute'), 100);
}

public function onPreRoute($e)
{
$app      = $e->getTarget();
$serviceManager       = $app->getServiceManager();
$serviceManager->get('router')->setTranslator($serviceManager->get('translator'));
}

И мой языковой файл de_De.php

return array(
'locale'  => 'de',
'setting' => 'Einstellung',
'add'     => 'hinzufügen',
);

В соответствии с приведенным выше кодом я могу перенаправить на контроллер настроек с маршрутом «language.devgrafioffshore.com/de/Einstellung«

Но не в состоянии перенаправить на
language.devgrafioffshore.com/de/Einstellung/hinzufügen который должен перенаправить меня, чтобы добавить действие, но я получаю

Запрашиваемый URL не может быть сопоставлен путем маршрутизации.

Заранее спасибо.
До свидания!

5

Решение

Я переписал ваш код в Zend Framework2, посмотрите, я попытаюсь объяснить

'router' => array(
'routes' => array(
'setting' => array(
'type'    => 'Literal',
'options' => array(
'route'    => '/setting',
'defaults' => array(
'__NAMESPACE__' => '<<MODULE NAME HERE>>\Controller',
'controller'    => 'SettingController',
'action'        => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'add' => array(
'type'    => 'Segment',
'options' => array(
'route'    => '/add[/:action[/:id]]',
'constraints' => array(
'action'     => '[a-zA-Z][a-zA-Z0-9_-]*'
),
),
),

)

),
),

Возможные маршруты через эту конфигурацию

установка / добавить / anyActionName

установка / добавить / добавить

установка / добавить / тест

Первое добавление не является действием, скорее оно действует как путь к действию. Второе «add» или «anyActionName» — это действия, которые вы хотите выполнить. С этой конфигурацией гораздо лучше то, что вы можете передавать идентификаторы также с именем действия через URL, но если вы не передадите идентификатор, все в порядке.

Еще одна очень важная вещь, конфигурация, определенная таким образом, помогает не определять каждое имя действия, потому что с

'constraints' => array(
'action'     => '[a-zA-Z][a-zA-Z0-9_-]*'
),

это ограничение на имя действия, любое имя действия может быть передано, если имя действия не содержит каких-либо специальных символов. Если у вас есть какие-либо вопросы относительно моего решения, не стесняйтесь спрашивать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]