对于zendframework2的路由配置的说明

来源:互联网 发布:好听的韩剧ost知乎 编辑:程序博客网 时间:2024/05/18 00:22

经过一下午的摸索,从基本的zendframework2的基础骨骼下面路由经常出问题,于是搜查了一下资料,得到了一份比较详细的路由配置:

<?phpreturn array(    'controllers' => array(        'invokables' => array(           'Shop\Controller\Shop' => 'Shop\Controller\ShopController',            'Shop\Controller\Index' => 'Shop\Controller\IndexController',        ),    ),    // The following section is new and should be added to your file    'router' => array(        'routes' => array(            'Shop' => array(                'type'    => 'segment',                'options' => array(                    'route'    => '/shop[/:controller[/:action]]',                    'constraints' => array(                        'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',                        'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',                    ),                    'defaults' => array(                        '__NAMESPACE__' => 'Shop\Controller',                        'controller' => 'Shop\Controller\Shop',                        'action'     => 'Index',                    ),                ),            ),        ),    ),    'view_manager' => array(        'template_path_stack' => array(            'shop' => __DIR__ . '/../view',        ),        /*        'display_not_found_reason' => true,        'display_exceptions'       => true,        'doctype'                  => 'HTML5',        'not_found_template'       => 'error/404',        'exception_template'       => 'error/index',        'template_map' => array(            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',            'application/index/index' => __DIR__ . '/../view/shop/shop/index.phtml',            'error/404'               => __DIR__ . '/../view/error/404.phtml',            'error/index'             => __DIR__ . '/../view/error/index.phtml',        ),*/    ),);

首先,我们看看新建一个模块的结构和目录,
这里写图片描述

请看上图,这里有通用的结构。目录有config,src,view及两个文件,Module.php及autoload_classmap.php。
config目录通常存放module.config.php里面配置该目录模块的url路径,模板存放位置,默认错误页面等等。src用于存放控制器。
view就用于存放layout【譬如,全局通用的footer,header及模板】,error【错误页面,自定义】,shop【这个是对应模块名称的模板,假如模块名称不叫shop叫test,那么这个文件夹名称就是test了。】,注意的是,shop下面的各个文件目录每一个目录对应一个控制器名称。Module.php格式如下:

<?phpnamespace Shop;class Module{    public function getAutoloaderConfig()    {        return array(            'Zend\Loader\ClassMapAutoloader' => array(                __DIR__ . '/autoload_classmap.php',            ),            'Zend\Loader\StandardAutoloader' => array(                'namespaces' => array(                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,                ),            ),        );    }    public function getConfig()    {        return include __DIR__ . '/config/module.config.php';    }}

通常需要改变的是namespace—注意,这个namespace是跟模块名称一样的。
autoload_classmap.php平时的内容如下:

<?phpreturn array();

这个文件用于预先加载一些类库,请注意,平时没有预先加载,不过假如自定义了一些类想要调用的话那么必须预先在这里定义,然后才能调用。譬如:
在vendor下面写了一些类用来操作mongodb,现在需要调用,
这里写图片描述
其中一个类如下:
这里写图片描述

那么需要在classmap里面注册:
这里写图片描述
那么就可以加载成功。

请注意,在新建了一个模块时,同时必须在下面文件注册该模块。
这里写图片描述

下面重点说说路由设置的相关注意事项。
这里写图片描述
请留意第一个,控制器 controllers下面的invokables,这个是注册所有模块控制器的,其中前面的是alias,后面是真实命名空间。
这个跟下面的路由 router规则息息相关。
现在看看路由规则,Shop这个是当前模块的路由规则,下面说说url

/shop[/:controller[/:action]]

这个参数是包裹形式,而不是

[/:controller][/:action]

这种形式的。
defaults参数设置相应的默认控制器及默认action,还有默认NAMESPACE,默认命名空间的设定要根据invokables来设定,
例如:
这里写图片描述
这个index和index最后的访问问件是:

_NAMESPACE+ controller +action而 _NAMESPACE= 'Shop\Controller'

那么

控制器就是:Shop\Controller\Index而action是:Index

我们看看invokables里面的关系:
这里写图片描述
可以知道alias

 'Shop\Controller\Index' => 'Shop\Controller\IndexController',

怎么样,看明白了没有?最后访问的控制器是

Shop\Controller\IndexController

那么为了验证一下,我们可以将namespace设置为空,然后alias改成index,看看如何:
这里写图片描述

然后访问index和shop来看看:
这里写图片描述
这里写图片描述

看到没有第二个报没有shop alias别名的错误了。

0 0