天天看點

Zend Framework 2 入門-路由-route

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]]。

繼續閱讀