在Zf2中实现Controller按照URL自动注册
博客专区 > phpy 的博客 > 博客详情
在Zf2中实现Controller按照URL自动注册
phpy 发表于4年前
在Zf2中实现Controller按照URL自动注册
  • 发表于 4年前
  • 阅读 680
  • 收藏 4
  • 点赞 1
  • 评论 2

【腾讯云】如何购买服务器最划算?>>>   

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

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

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


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


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

public function testAutoAction(){
    echo "users";
    die;
}



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

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

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

'controllers' => array(
        'invokables' => array(
            'Application\Controller\Index' => 'Application\Controller\IndexController',
            'Application\Controller\Users' => 'Application\Controller\UsersController'
        )
        
    ),



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

1、创建一个抽象工厂

//module/Application/src/Application/Services/CommonControlAppAbstractFactory.php
namespace Application\Services;
use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class CommonControlAppAbstractFactory implements AbstractFactoryInterface{
    
    
    public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName){
        if(class_exists($requestedName.'Controller')){
            return true;
        }
        return false;
    }
    
    public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName){
        $class = $requestedName.'Controller';
        return new $class;
    }
    
}

2、注册到getControllerConfig()

//module/Application/Module.php
    public function getControllerConfig(){
        return array(
            'abstract_factories'=>array('Application\Services\CommonControlAppAbstractFactory')
        );
    }

再次运行

这样就大功告成了。


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
博文 14
码字总数 2054
评论 (2)
Fengjian35
当Route 的规则更改后,会不会出现问题呢?
phpy

引用来自“Fengjian35”的评论

当Route 的规则更改后,会不会出现问题呢?

看你如何去定义Route 规则。
以下是我新定义的Route ,使用了命名空间后,同样运行成功。
'users' => array(
'type' => 'Segment',
'options' => array(
'route' => '/users[/:action]',
'constraints' => array(
'action' => '[a-zA-Z_-]+',
),
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Users',
'action'     => 'index',
),
),
),
×
phpy
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: