khu*_*uri 5 php zend-translate zend-route zend-framework2 zend-framework3
我是Zend框架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',
],
],
],
],
],
],
],
Run Code Online (Sandbox Code Playgroud)
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'));
}
Run Code Online (Sandbox Code Playgroud)
我的语言文件是de_De.php
return array(
'locale' => 'de',
'setting' => 'Einstellung',
'add' => 'hinzufügen',
);
Run Code Online (Sandbox Code Playgroud)
根据我的上述代码,我可以使用" language.devgrafioffshore.com/de/Einstellung " 路线重定向到设置控制器
但是无法重定向到 language.devgrafioffshore.com/de/Einstellung/hinzufügen应该重定向我添加动作但我得到
路由无法匹配请求的URL.
先感谢您.再见!
小智 1
我已经在 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_-]*'
),
),
),
)
),
),
Run Code Online (Sandbox Code Playgroud)
通过此配置的可能路线是
设置/添加/anyActionName
设置/添加/添加
设置/添加/测试
第一个添加不是一个操作,而是充当操作的路径。第二个“add”或“anyActionName”是您要执行的操作。使用此配置的一个更好的事情是,您还可以通过 URL 传递 ID 和操作名称,但如果您不传递任何 ID,也没关系。
还有一件非常重要的事情,以这种方式定义的配置有助于不必定义每个操作名称,因为
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*'
),
Run Code Online (Sandbox Code Playgroud)
这个对动作名称的约束,任何动作名称都可以通过,除非动作名称包含任何特殊字符。如果您对我的解决方案有任何疑问,请随时提问。
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |