0
我想和一個可選的[郎鹹平]參數將用於設置應用程序的語言創建如下路線:與段類別的子路由ZF3可選參數並不想匹配
默認實例朗PARAM(EN例如)
domain.tld/
domain.tld/users
domain.tld/contacts
etc.
例維特新郎PARAM(DE爲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,
],
],
],
],
]
當我在URL一切郎參數是罰款。但是,當我嘗試打開「默認」郎而沒有指定它的路徑(例如.tld /應用程序/測試)它給我404錯誤。
我發現從段類轉換後的最終正則表達式是(\G(?:/(?P<param1>([a-z]{2})))?)
,路徑是/application/test
。當preg_match
上Segment.php執行:385將其與下面的值返回匹配:
這顯然是錯誤的行爲。我的語言設置爲「廣告」,而不是打開應用程序/測試操作。我測試了10多個正則表達式,但沒有成功......(例如:^[a-z]{2}$
)。
我做錯了什麼?
謝謝你的答案。它的工作原理是這樣的,但我的問題是,我在數據庫中添加了語言,因此它們是動態創建的,無法在約束數組中進行硬編碼。所以我需要匹配excactly 2個字符或無(默認)。也許正則表達式是錯誤的?我試圖匹配像''a-z] {2} |^$'這樣的空字符串,但也沒有工作。我希望你明白我的需要是什麼? – Botman
你是在說'constraints'=> ['lang'=>'(en | de)?']'?你可以把'(en | de)?'改成'[a-z] {2}',它就可以工作。我檢查了乾淨的Zend Skeleton項目。 – SzymonM
是的,我發現有什麼問題。我的孩子的路線已經預先加了斜線,並且不可能將路線與它匹配。一切都很好,但這是一種在兒童路線中使用斜線而不是父母的方式。 '[/:朗]'?我需要這樣做,因爲我的應用程序可以在子域語言風格或路徑風格之間進行選擇,因此我可以選擇上面所示的基本路線或'type'=> Hostname :: class, 'options'=> [ 'route'=> '[:lang。] framework.dev', ],',但我不能在主機名rotue內使用斜槓,如果我沒有在子路由中設置斜槓,它將制動主機名路由。 – Botman