Zend Framework 2 入门-路由-route

时间:2021-03-18 11:08:58

ZF2的路由功能十分强大,在这里简要的介绍下其使用方法。

我们首先来看看ZendSkeletonApplicatio中Application模块中默认的路由设置

(path:/module/Application/config/module.config.php)

'router' => array(
    'routes' => array(
        'home' => array(
            'type' => 'Zend\Mvc\Router\Http\Literal',
            'options' => array(
                'route' => '/',
                'defaults' => array(
                    'controller' => 'Application\Controller\Index',
                    'action' => 'index',
                ),
            ),
        ),
        // 下面我们将要创建一个新的路由,只用穿件新的控制器和方法,
        // 而不用创建一个新的模块,并通过路由/application/:controller/:action
        // 来访问。
        '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]]',
                    'constraints' => array(
                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    ),
                    'defaults' => array(),
                ),
            ),
        ),
    ),
),

所有的路由信息都是存在与每个模块的module.config.php文件中,在系统初始化的时候统一载入。

首先我们来看默认的主页路由:

'home' => array(
    'type' => 'Zend\Mvc\Router\Http\Literal',
    'options' => array(
        'route' => '/',
        'defaults' => array(
            'controller' => 'Application\Controller\Index',
            'action' => 'index',
        ),
    ),
),

‘home’:路由名

‘type’ : 路由类型

路由有两种类型:

1. Literal(Zend\Mvc\Router\Http\Literal):此种类型的路由,路由是固定值。
2. Segment(Zend\Mvc\Router\Http\Segment):此种类型的路由,路由是变量。
‘options’ : 路由选项
‘route’:路由值,那么此时的“/”代表什么呢或许这样你就明白了(<a href=”/”>star</a>),对代表的就是根目录。
‘defaults’ : 路由的默认属性,其中包括控制器(Controller)和方法(action)的默认值。

注:在Literal 模式下控制器和方法的默认值必填,否则无法确认其路由的指向。在Segment 模式下为选填项目。
也算就是说当我们访问访问我们的主页的时候,我们实际上就是调用的,Application\Controller\Index::indexAction()。

那么对于我们后面添加的路由就比较容易理解了。下面将其做一个简单的介绍。

application这个路由指向 ‘http://yourdomain/application’ 与之对应的方法为: Application\Controller 命名空间下的 IndexController 控制器中得indexAction()方法。

明明是 IndexController 控制器为什么在配置的时候只是写Index就行了呢,检查下你当前Module.config.php中的controllers 配置信息你就明白了。

child_routes代表的是什么呢?当然就是子路由了,也就是 ‘http://yourdomain/application/[:controller[/:action]]’这个路由啦。

(注意这里的[:controller[/:action]]和[:controller][/:action]也是有区别得哟,我将在后面做一个简要的介绍。)

至于这个 may_terminate 参数对于拥有子路由的路由是相当重要的/[:controller[/:action]]啦, 若没有这个参数,就会忽略父路由,直接进入子路由。

大家可能注意到这种模式(Segment) 与 ‘Literal’模式的options参数有一定的区别

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

此时的路由(‘route’)参数为 ‘/[:controller[/:action]]’,其实就将其看成变量就行了,”[]”中间的为变量,并且可以通过 constraints参数来控制变量”[a-zA-Z][a-zA-Z0-9_-]*”代表的是什么?我相信对正则有一定了解的都能看得懂吧,当前配置表明:controller这个变量的值必须以大写或者小写的字母开头,后面可以跟“a-zA-Z0-9_-”中的任何值。

 

那么在views中我们怎么使用这些路由信息来生成url呢, 直接在views中使用$this->url(‘route’)就行了。

比如我们要生成 /application/mycontroller/myaction这样的链接呢?

//生成简单的路由
<a href=”<?php echo $this->url('application/default',array('controller' => 'mycontroller', 'action' => 'myaction')); ?>”>Myaction</a>

//output
<a href=”/application/mycontroller/myaction”>Myaction</a>

//生成完整的路由
<a href=”<?php echo $this->url('application/default',array('controller' => 'mycontroller', 'action' => 'myaction'),array('force_canonical' => true)); ?>”>Myaction</a>

//output
<a href=”http://yourdomain/application/mycontroller/myaction”>Myaction</a>

相信大家看见这里就能写出自己完整的路由了吧。

 

下面将介绍一点路由上的小技巧:

1.还记得我们上面提出来的[:controller[/:action]]和[:controller][/:action]这两种写法吗?

一般情况下我们都有默认得控制器和方法

比如我们设置默认控制控制器(controller)为index,默认方法(action)也为index,那么当我们直接访问/application/的时候就相当于是访问/application/index/index,那么此时对于后面的一种访问方法就没有意义了,所有当其为默认值的时候就自动呗舍弃了,那么此时在views或者其他地方调用的时候就会初现一些小问题。

 eg.$this->('application/default',array('controller' => 'index', 'action' => 'noindex'));

//[:controller[/:action]] output
/application/index/noindex

//[:controller][/:action] output
/application/noindex

这样就很容易看出区别了吧[:controller[/:action]] 这种书写方法,用大括号将controller和action都扩起来,二者视为一个整体,只有当二者都为默认值的时候才会将其省略。而[:controller][/:action]二者都为独立的个体,是要任何一项为默认值都会将其省略。所有不小心就会得到错误得路由信息。

 

2. 还是以上面的路由信息为例。

默认情况下我们需要访问http://yourdomain/application/,那么我们同时想访问http://yourdomain/application这种形式的呢? 直接改成[/][:controller[/:action]],或者我们只想在Controller不为默认值的时候初现application/…这种形式呢,只要改成这样就好了:[/:controller[/:action]]。