Zend Framework 2通配符路由

时间:2013-12-17 02:02:42

标签: zend-framework2 url-routing zend-framework-routing

我的module.config.php中有以下路线:

'routes' => array(
    'admin' => array(
        'type' => 'Segment',
        'options' => array(
            'route' => '/admin[/:controller[/:action]][/]',
            'constraints' => array(
                'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
                'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
            ),
            'defaults' => array(
                '__NAMESPACE__' => 'Admin\Controller',
                'module' => 'Admin',
                'controller' => 'Index',
                'action' => 'index',
            ),
        ),
        'may_terminate' => true,
        'child_routes' => array(
            'wildcard' => array(
                'type' => 'Wildcard',
            )
        ),
        'priority' => 1000
    ),
),

路线末尾[/]的原因在于:Zend Framework 2 Segment Route matching 'test' but not 'test/'

我希望这条路线与ZF1一样。我想在其中传递$_GET parameters(例如/id/1/test/2/)。

此路线实际上与/admin/customer/edit//id/20匹配但不匹配/admin/customer/edit/id/20

的问题

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你走在正确的轨道上!使用"威尔卡"作为管理路线的一种子路线。

有两种选择: key_value_delimiter param_delimiter 。 这两个默认值都是' /'这等于路由参数的ZF1默认行为。

'router' => array(
    'routes' => array(
        'admin' => array(
            'type' => 'Segment',
            'options' => array(                
                'route' => '/admin[/:controller[/:action]]',
                'constraints' => array(
                    'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
                ),
            ),
            'defaults' => array(
                '__NAMESPACE__' => 'Admin\Controller',
                'module' => 'Admin',
                'controller' => 'Index',
                'action' => 'index',
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'wildcard' => array(
                    'type' => 'Wildcard',
                    'options' => array(
                       'key_value_delimiter' => '/',
                       'param_delimiter' => '/'
                    )
                )
            )
        )
    )
)

如果你想在url view-helper的帮助下解决通配符路由,你可以这样使用它:

$this->url('admin/wildcard', array('id' => 1234, 'foo' => 'bar'));

答案 1 :(得分:0)

您可以为id:

添加路由参数
'route' => '/admin[/:controller[/:action]][/:id][/]',
    'constraints' => array(
         'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
         'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
         'id' => '[0-9]+',
),

此路由匹配admin/customer/edit/20/,因此您可以在控制器中获取ID:

$this->params()->fromRoute('id');

如果您想admin/customer/edit/id/20/,请尝试:

'route' => '/admin[/:controller[/:action]][id/:id][/]',

答案 2 :(得分:0)

如果我理解正确,您正试图从URL获取多个参数,对吗?

e.g。

传统GET:www.domain.com/ctrl/action?key1=abc&key2=efg& ......& keyN = XYZ

ZF2路线:www.domain.com/ctrl/action/key1/abc/key2/efg /.../ keyN / xyz

如果是这样,这是一种方法:

            'adminPage' => array(
            'type' => 'regex',
            'options' => array(
                'regex' => '/admin/customer/edit[/](?<keyValuePairs>.*)',
                'defaults' => array(
                    'controller' => 'YourProject\Controller\YourController',
                    'action' => 'yourAction',
                ),
                'spec' => '/admin/customer/edit/%keyValuePairs%',
            )

有了这个,管理员/客户/编辑/&#39;将被存储在&#39; keyValuePairs&#39;参数。在Controller :: yourAction中,获取&#39; keyValuePairs&#39;参数,然后将字符串拆分回有意义的键值数据结构。