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

Regex Zend Framework 2子正则表达式和文本路由,regex,zend-framework2,zend-framework-routing,Regex,Zend Framework2,Zend Framework Routing,基于这个stackoverflow问题,我已经完成了我的应用程序有一个基于正则表达式的路由,所以我可以将它传递给我的视图和编辑操作 app/123-app控制器查看操作(按文章id获取) 应用程序/文章名称-应用程序控制器查看操作(按文章名称获取) app/123/编辑-app控制器编辑操作(文章id) 应用程序/文章名称/编辑-应用程序控制器编辑操作(文章名称) app/search/{search string}-app controller搜索操作(当前仅接受不带空格和特殊字符的sear

基于这个stackoverflow问题,我已经完成了我的应用程序有一个基于正则表达式的路由,所以我可以将它传递给我的视图和编辑操作

  • app/123-app控制器查看操作(按文章id获取)
  • 应用程序/文章名称-应用程序控制器查看操作(按文章名称获取)
  • app/123/编辑-app控制器编辑操作(文章id)
  • 应用程序/文章名称/编辑-应用程序控制器编辑操作(文章名称)
  • app/search/{search string}-app controller搜索操作(当前仅接受不带空格和特殊字符的searchstring)
我用下面的代码完成了这一点,与上面链接中的代码类似:

'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,
),
它只是打印/app而不是/app/recent

$action='search'
$action='new'
仅打印/app时,也会发生同样的情况


第二个是,只有当我在其中放入空格或特殊字符时搜索失败,搜索才会被识别为其控制器操作

当我尝试在searchkey(“[\sa-zA-Z0-9_-]”的约束中添加\s时,它将路由到edit函数

搜索路线如下所示

编辑了到这个的路线,它成功了

'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'=>数组(
'类型'=>'段',
“选项”=>数组(
“路由”=>“/app[/:操作]”,
'约束'=>数组(
“行动”=>“[a-zA-Z][a-zA-Z0-9_u-]*”,
“id'=>”[0-9]+',
),
“默认值”=>数组(
“控制器”=>“应用程序\控制器\应用程序”,
“操作”=>“索引”,
),
),
“may_terminate”=>true,
),
'搜索'=>数组(
'type'=>'literal',
“选项”=>数组(
“路由”=>“/app/search”,
“默认值”=>数组(
“控制器”=>“应用程序\控制器\应用程序”,
“操作”=>“搜索”,
),
),
“优先级”=>1,
“may_terminate”=>true,
“子路由”=>数组(
'搜索'=>数组(
'类型'=>'段',
“选项”=>数组(
“路由”=>“/[:搜索键]”,
'约束'=>数组(
“搜索键”=>“[\sa-zA-Z0-9\+-]+”
),
“默认值”=>数组(
“操作”=>“搜索”
),
),
“优先级”=>2,
“may_terminate”=>true,
),
),
),
'新'=>阵列(
'type'=>'literal',
“选项”=>数组(
“路由”=>“/app/new”,
“默认值”=>数组(
“控制器”=>“应用程序”,
“操作”=>“最近”,
),
),
“优先级”=>2,
),
“视图”=>数组(
'type'=>'regex',
“选项”=>数组(
“regex'=>”/app/(?[a-zA-Z0-9_-]+),
“默认值”=>数组(
“控制器”=>“应用程序\控制器\应用程序”,
“操作”=>“视图”,
),
“spec'=>”/app/%view%',
),
),
“编辑”=>数组(
'type'=>'regex',
“选项”=>数组(
“regex'=>”/app/(?[a-zA-Z0-9_-]+)/(?[a-zA-Z0-9_-]+),
“默认值”=>数组(
“控制器”=>“应用程序\控制器\应用程序”,
“操作”=>“编辑”,
),
“spec'=>”/app/%view%/%edit%',
),
),
如果您需要其他路由,只需在te
app
route下面添加一个新的文字路由,请确保不要忘记设置
优先级

'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%',
    ),
),