我想创建带有可选[lang]参数的路由,该参数将用于设置应用程序语言,如下所示:
默认lang param示例(例如EN)
domain.tld/
domain.tld/users
domain.tld/contacts
etc.
新lang param(DE for examle)的例子
domain.tld/de
domain.tld/de/users
domain.tld/de/contacts
etc.
这是我的路线配置:
'router' => [
'routes' => [
'site' => [
'type' => Segment::class,
'options' => [
'route' => '[/:lang]',
'constraints' => [
'lang' => '[a-z]{2}',
],
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
'lang' => 'en',
],
],
'may_terminate' => true,
'child_routes' => [
'home' => [
'type' => Literal::class,
'options' => [
'route' => '/',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
'may_terminate' => true,
],
'application' => [
'type' => Segment::class,
'options' => [
'route' => '/application[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
'may_terminate' => true,
],
],
],
],
]
当我在网址中有lang param时,一切都很好。但是当我试图打开"默认" lang没有指定它进入路径(例如example.tld / application / test)它给我404错误。
我发现从Segment类转换后的最终正则表达式为(\G(?:/(?P<param1>([a-z]{2})))?)
,路径为/application/test
。在Segment.php:385上执行preg_match
时,它返回与以下值匹配的内容:
[
'0' => '/ad',
'param1' => 'ad',
'1' => 'ad',
],
这显然是错误的行为。我的语言设置为&#34; ad&#34;而不是打开应用程序/测试操作。我测试了大约10个正则表达式但没有成功......(例如^[a-z]{2}$
)。
我做错了什么?
答案 0 :(得分:0)
您收到404因为网址与site
路由不匹配,因此会跳过site
的子路由。
试试这个:
'home' => [
'type' => Segment::class,
'options' => [
'route' => '/[:lang/]',
'constraints' => [
'lang' => '(en|de)?',
],
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
'lang' => 'en',
],
],
'may_terminate' => true,
'child_routes' => [
'application' => [
'type' => Segment::class,
'options' => [
'route' => 'application[/:action]',
'defaults' => [
'controller' => Controller\IndexController::class,
'action' => 'index',
],
],
],
],
]
如果您不提供lang param,则默认情况下(我的示例中为en
)参数。
示例:
将example.tld /应用/测试
lang
是en
controller
是IndexController
action
是test
(testAction()
)将example.tld / DE /应用/测试
lang
是de
controller
是IndexController
action
是test
(testAction()
)