在Zf2中实现Controller按照URL自动注册

本文介绍在ZF2中实现Controller按URL自动注册的方法,避免大量手动注册的繁琐过程。通过创建抽象工厂并注册到getControllerConfig(),可以轻松实现新增Controller的自动加载。

http://my.oschina.net/phpyer/blog/189735

在Zf2中,一般的情况下,在modules的的某个模块的controller目录下添加一个controller 文件,对应的需要在module.config.php 中注册。 这样是为了启用灵活,但是当controller 文件特别多的时候,注册controller 的时候就感觉很繁琐,所有添加配置,实现Controller按照URL自动注册。

例如:Application 模块,在其controller目录下有两个controller 文件。如图:

 

IndexController已经在module.config.php 中注册,而UsersController没有注册。如图:

 

在UsersController文件中,写一个测试的action :

1 public function testAutoAction(){
2     echo "users";
3     die;
4 }



在浏览器中访问通过正确的URL 访问测试action 时,出现错误。如图:

从错误信息可以看出,UsersController 没有注册。如何解决它,那么就需要注册UsersController了。

 一种方法是在module.config.php 中添加UsersController 的注册信息。

1 'controllers' => array(
2         'invokables' => array(
3             'Application\Controller\Index' => 'Application\Controller\IndexController',
4             'Application\Controller\Users' => 'Application\Controller\UsersController'
5         )
6          
7     ),



另一种方法是当你不想每添加一个controller时,去注册一次,那么就使用如下的方法。

1、创建一个抽象工厂

01 //module/Application/src/Application/Services/CommonControlAppAbstractFactory.php
02 namespace Application\Services;
03 use Zend\ServiceManager\AbstractFactoryInterface;
04 use Zend\ServiceManager\ServiceLocatorInterface;
05 class CommonControlAppAbstractFactory implements AbstractFactoryInterface{
06      
07      
08     public function canCreateServiceWithName(ServiceLocatorInterface $locator$name$requestedName){
09         if(class_exists($requestedName.'Controller')){
10             return true;
11         }
12         return false;
13     }
14      
15     public function createServiceWithName(ServiceLocatorInterface $locator$name$requestedName){
16         $class $requestedName.'Controller';
17         return new $class;
18     }
19      
20 }

2、注册到getControllerConfig()

1 //module/Application/Module.php
2     public function getControllerConfig(){
3         return array(
4             'abstract_factories'=>array('Application\Services\CommonControlAppAbstractFactory')
5         );
6     }

再次运行

这样就大功告成了。


References :

1.http://samsonasik.wordpress.com/2012/12/23/zend-framework-2-automatic-controller-invokables-via-abstract-factories/

2.https://packages.zendframework.com/docs/latest/manual/en/index.html



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值