在URL中传递数据时的路由

时间:2012-11-10 12:04:36

标签: zend-framework2

我使用Skeleton应用程序和模块创建了一个基本的Zend Framework 2应用程序,尽管我遇到了路由问题但似乎无法解决它。

在我的模块中,它松散地基于Zend Framework网站上的新Quickstart模块,我在module.config.php中有以下路由

'router' => array(
    'routes' => array(
        'blog' => array(
            'type'    => 'Literal',
            'options' => array(
                // Change this to something specific to your module
                'route'    => '/blog',
                'defaults' => array(
                    // Change this value to reflect the namespace in which
                    // the controllers for your module are found
                    '__NAMESPACE__' => 'Blog\Controller',
                    'controller'    => 'View',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                // This route is a sane default when developing a module;
                // as you solidify the routes for your module, however,
                // you may want to remove it and replace it with more
                // specific routes.
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '[/:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),

使用标准模块,控制器和操作URL请求时,此路由似乎正常工作:

blah.com/blog/post/view

当我遇到问题时,我尝试通过网址传递一些数据:

blah.com/blog/post/view/id/1

两个URL中的后一个导致404.我猜我需要一个子路由来允许在URL上传递数据,尽管我仍然坚持我需要的东西。有人能指出我正确的方向吗?我浏览过参考指南,虽然我似乎无法跨越界限。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

您必须在路线中添加可选细分。同时为其添加默认值:试试这个:

'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '[/:controller[/:action[/id[/:idvar]]]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                            'idvar'  => '0'
                        ),
                    ),
                ),

并在您的控制器操作中,尝试:

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

检索idvar值。

答案 1 :(得分:2)

如果您需要多个可选参数且可以任意随机组合提供的参数(例如pageNumber = 2,参与=活动),您需要添加类型查询的子路由,并且可以完全提供GET参数灵活:

使用此合成代码可以使用url视图助手构建适合以下示例的url: $ this-> url('event / index / query',array('o_id'=> 1,'participation'=>'active','pageNumber'=>'2'));

    'routes' => array(
       'event' => array(
            'type'    => 'literal',
            'options' => array(
                'route'    => '/event',
                'defaults' => array(
                    'controller' => 'cebEvent.eventController',
                    'action'     => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'index' => array(
                    'type' => 'segment',
                    'options' => array(
                        'route' => '/index[/:o_id]',
                        'defaults' => array(
                            'controller' => 'eventController',
                            'action'     => 'index',
                        ),
                    ),
                    'may_terminate' => true,
                    'child_routes' => array(
                        'query' => array(
                            'type' => 'Query',
                        ),
                    ),

                ),