繁体   English   中英

Zend Framework 2子正则表达式和文字路由

[英]Zend Framework 2 child regex and literal routing

基于这个stackoverflow问题15077075,我已经实现了我的应用程序具有基于正则表达式的路由,因此可以将其传递给我的视图和编辑操作。

  • app / 123-应用控制器视图操作(按文章ID获取)
  • app /商品名称-应用控制器视图操作(按商品名称获取)
  • app / 123 / edit-应用控制器编辑操作(文章ID)
  • 应用程序/文章名称/编辑-应用程序控制器编辑操作(文章名称)
  • app / search / {search-string}-应用控制程序的搜索操作(当前仅接受不带空格和特殊字符的搜索字符串)

我用下面的代码完成了此工作,类似于上面的链接中的代码:

'app' => array(
    'type'    => 'literal',
    'options' => array(
        'route'    => '/app',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action'     => 'index',
        ),
    ),
    'may_terminate' => true,
),
'view' => array(
    'type' => 'regex',
    'options' => array(
        'regex' => '/app/(?<view>[a-zA-Z0-9_-]+)',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'view',
        ),
        'spec' => '/app/%view%',
    ),
    'priority' => -1000,
),
'edit' => array(
    'type' => 'regex',
    'options' => array(
        'regex' => '/app/(?<view>[a-zA-Z0-9_-]+)/(?<edit>[a-zA-Z0-9_-]+)',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'edit',
        ),
        'spec' => '/app/%view%/%edit%',
    ),
    'priority' => -1000,
),

我有 两个 问题,第一个是url viewhelper无法识别我的路线

$controller = app
$action = recent
$this->url( $controller, array( 'action' => $action ) )

它只打印/ app而不是/ app / recent,

$action = 'search'$action = 'new' ,只会输出/ app


第二个是只有当我在其中添加空格或特殊字符时,搜索才被识别为其控制器动作

当我尝试在searchkey('[\\ sa-zA-Z0-9 _-] +')的约束中添加\\ s时,它将路由到编辑功能

搜索路线如下所示

编辑到此的路线并成功了

'search' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/app/search',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action'     => 'search',
        ),
    ),
    'may_terminate' => true,
    'child_routes' => array(
        'search' => array(
            'type' => 'segment',
            'options' => array(
                'route' => '/[:searchkey]',
                'constraints' => array(
                    'searchkey' => '[a-zA-Z0-9_\+-]+'
                ),
                'defaults' => array(
                    'action' => 'search'
                ),
            ),
        ),
    ),
),

我希望很清楚,如果需要任何代码片段,我想要什么,请询问

整理出来!
如果需要以这种方式在他的应用程序中获取路由,则可以使用以下代码

/App                        App/Index
/App/name-of-article        App/View
/App/123                    App/View
/App/name-of-article/edit   App/Edit
/App/123/edit               App/Edit
/App/recent                 App/Recent
/App/search                 App/Search
/App/new                    App/New

在我的module.config.php我将路由更改为:

'app' => array(
    'type' => 'segment',
    'options' => array(
        'route' => '/app[/:action]',
        'constraints' => array(
            'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
            'id' => '[0-9]+',
        ),
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'index',
        ),
    ),
    'may_terminate' => true,
),

'search' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/app/search',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'search',
        ),
    ),
    'priority' => 1,
    'may_terminate' => true,
    'child_routes' => array(
        'search' => array(
            'type' => 'segment',
            'options' => array(
                'route' => '/[:searchkey]',
                'constraints' => array(
                    'searchkey' => '[\sa-zA-Z0-9_\+-]+'
                ),
                'defaults' => array(
                    'action' => 'search'
                ),
            ),
            'priority' => 2,
            'may_terminate' => true,
        ),
    ),
),

'new' => array(
    'type' => 'literal',
    'options' => array(
        'route' => '/app/new',
        'defaults' => array(
            'controller' => 'App',
            'action' => 'recent',
        ),
    ),
    'priority' => 2,
),

'view' => array(
    'type' => 'regex',
    'options' => array(
        'regex' => '/app/(?<view>[a-zA-Z0-9_-]+)',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'view',
        ),
        'spec' => '/app/%view%',
    ),
),

'edit' => array(
    'type' => 'regex',
    'options' => array(
        'regex' => '/app/(?<view>[a-zA-Z0-9_-]+)/(?<edit>[a-zA-Z0-9_-]+)',
        'defaults' => array(
            'controller' => 'App\Controller\App',
            'action' => 'edit',
        ),
        'spec' => '/app/%view%/%edit%',
    ),
),

如果您需要其他路由,只需在app路由下方添加一个新的文字路由,请确保不要忘记设置priority

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM