经过一下午的摸索,从基本的zendframework2的基础骨骼下面路由经常出问题,于是搜查了一下资料,得到了一份比较详细的路由配置:
<?php
return 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格式如下:
<?php
namespace 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平时的内容如下:
<?php
return 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别名的错误了。