在ZF2路由器中注入默认值

时间:2013-06-25 09:08:32

标签: php zend-framework zend-framework2 router zend-router

我目前的分段路线如下所示:/shop/:shopId/其中shopId没有默认值。

每当匹配路由时,触发Module.php中的代码,根据shopId进行一些准备,并将其保存在会话中。

我的问题是,如果有可能,那么,将路由的默认值设置为shopId?最终目标是能够在此时不再指定shopId来组合URL。

我记得在ZF1中这种行为是默认的,其中来自Request的匹配的params在组装URL时被重用,你必须明确指定你想要删除它们。现在我需要相同的功能,但是在Module.php级别配置,而不是必须重写每个assemble()次呼叫。

1 个答案:

答案 0 :(得分:1)

选项一:来自你的indexAction

$id = $routeMatch->getParam('id', false);
if (!$id)
   $id = 1; // id was not supplied set default one note this can be added as constant or from db .... 

选项二:在module.config.php中设置路由

'product-view' => array(
                'type'    => 'Literal',
                'options' => array(
                    'route'    => '/product/view',
                    'defaults' => array(
                        'controller'    => 'product-view-controller',
                        'action'        => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type'    => 'Segment',
                        'options' => array(
                            'route'    => '[/:cat][/]',
                            'constraints' => array(
                                'cat'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
在你的控制器中

public function indexAction()
    {
        // get category param
        $categoryParam = $this->params()->fromRoute('cat');
        // if !cat then get random category 
        $categoryParam = ($categoryParam) ? $categoryParam : $this->categories[array_rand($this->categories)];
        $shortList = $this->listingsTable->getListingsByCategory($categoryParam);
        return new ViewModel(array(
            'shortList' => $shortList,
            'categoryParam' => $categoryParam
        ));
    }