如何在ZendFramework 2中使用params?

时间:2014-12-18 17:31:50

标签: php zend-framework routes zend-framework2

我在module.config.php中配置了一条路线来处理两个参数, 这里是文件module.config.php的内容,我只是定义了路由(相同的路由):

已更新:

 'router' => array(
        'routes' => array(
            'Products' => array(
                'type' => 'Zend\Mvc\Router\Http\Literal',
                'options' => array(
                    'route' => '/application/admin/products[/:id]',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller' => 'Admin',
                        'action' => 'index',
                    ),
                ),
            ),
            'productsList' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/application/products/productsList[/:type][/:id]',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller' => 'Products',
                        'action' => 'productsList'
                    ),
                ),
            ),

            'Emplacement' => array(
                'type' => 'segment',
                'options' => array(
                    'route' => '/application/support/listeEmplacementsSupport[/:pkSupport]',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller' => 'Support',
                        'action' => 'listeEmplacementsSupport',
                    ),
                ),
            ),
            'application' => array(
                'type' => 'Literal',
                'options' => array(
                    'route' => '/application',
                    'defaults' => array(
                        '__NAMESPACE__' => 'Application\Controller',
                        'controller' => 'Index',
                        'action' => 'index',
                    ),
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'default' => array(
                        'type' => 'Segment',
                        'options' => array(
                            'route' => '/[:controller[/:action[/:id][/:dr]]]',
                            'constraints' => array(
                                'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                                'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            ),
                            'defaults' => array(
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),

我使用以下

在视图中构建链接
<a href="/application/products/productsList/mandan/<?php echo $coreg['idProduct']; ?>" >
    <img height='20' src="/img/mail-recevoir-32.png" alt='products' />
</a>    

要使用一个参数

$param = $this->params('id');

1 个答案:

答案 0 :(得分:0)

路线以'Last in first out' LIFO顺序匹配。

The relevant section of the documentation states

  

通常,应该以LIFO顺序查询路由,因此名称为RouteStack的原因。 [...]您需要确保注册可能重叠的路线,以便最具体的匹配首先匹配(即稍后注册)

因此,根据您当前的配置,因为所有路由都在顶层注册,所以最后一条路由(application/default)正在被检查,然后在productList给定之前首先匹配机会。

另外,因为application/default将可选的id参数定义为第一个参数,这是您在使用type时获得$this->params('id')参数值的原因。

<强> Soultion

最简单的解决方案就是重新排序路线;将application路线右移到定义的顶部应该有效。

订单应如下

'router' => array(
    'routes' => array(

        'application' => array(
            // .. same
            'child_routes' => array(
                'default' => array(
                    // .. Same
                ),
            ),
        ),

        'Products' => array(
            // ..same
        ),
        'productsList' => array(
            // ..same
        ),

        'Emplacement' => array(
            // ..config
        ),

    ),
),

你可以选择给每条路线一个优先级,不管顺序如何,但是我认为将它们保持在自然顺序以保存未来的混淆会更有意义。

我在这里

我在评论中提到您错误地使用了Literal路线而不是SegmentProducts路由定义存在同样的问题。如果路线是文字的,则只会匹配完全值(因此您需要在网址中使用/[:id])。

/application/admin/products[/:id] 

因此,您还需要将此路线更新为segment,以便将产品ID视为参数。

最后,使用URL view helper可以更轻松地在视图中构建网址。您的视图脚本代码将更改为

<?php
    $type = 'mandan';
    $id   = $coreg['idProduct']; 
?>
<a href="<?php echo $this->url('productsList', compact('type', 'id')); ?>">
    <img height='20' src="/img/mail-recevoir-32.png" alt='products' />
</a>