首页 > zendframework多模块配置

zendframework多模块配置

2013-01-06   hisenKing

目前所在小组使用到的都是基于zf框架搭建的项目。相比老系统的结构与代码的逻辑性方面,基于zf搭建的系统还是有明显好处。在多人开发的情况下,代码的可控性上也有它的优势。

首先来讲讲jgbcrm的配置运行方式,使用了多模块配置方式。其中流程基本上和我配置的相同,这边就大致讲下一些环境的区别和使用要点。
index.php->config.php->Bootstrap.php(application目录下)->Common.php(类名Jgb_Controller_Plugin_Common)

1)index.php和config.php合起来是引导文件
2)Bootstrap.php初始化一些系统的配置信息,并注册插件类Jgb_Controller_Plugin_Common
3)Common.php对具体的插件类进行注册,包括Db,smarty,以及相应模块的插件。其中Db封装之后,数据库操作类都是继承了这个类,具体实现了主从的多数据库对象获取,以及自定义数据库适配器adapterNamespace。

下面的安装方式是使用了NetBeans生产的zf项目之后修改而来的,以下是具体的配置方式:

目录结构:

├─application
│  │  Bootstrap.php
│  ├─configs
│  │      application.ini
│  └─modules
│      │  Bootstrap.php
│      ├─blog
│      │  │  Bootstrap.php
│      │  ├─apps
│      │  │      Linux.php
│      │  ├─controllers
│      │  │      IndexController.php
│      │  └─models
│      │          Book.php
│      └─default
│          │  Bootstrap.php
│          ├─controllers
│          │      ErrorController.php
│          │      IndexController.php
│          └─models
│                  Book.php
└─public
│  .htaccess
│  index.php
├─css
│      cssweb.css
├─images
└─js


1.首先配置apache
开启urlrewrite,打开httpd.cnf找到

#LoadModule rewrite_module modules/mod_rewrite.so

去掉前面的#;
配置虚拟主机,找到

#LoadModule vhost_alias_module modules/mod_vhost_alias.so

,去掉前面的#,我的配置信息如下:

NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080

ServerName zend
DocumentRoot "D:/wamp/www/Zend-1.0/public"

AllowOverride All
Allow from all


SetEnv APPLICATION_ENV "development"

ErrorLog "logs/rentaflat-error-1.0.log"
CustomLog "logs/rentaflat-access-1.0.log" combined

使用的常量APPLICATION_ENV在apache中进行了配置,用来区分开发环境和生产环境,也可以在.htaccess进行配置。个人觉得配置在apache中比较适合,配置在.htaccess可能会不小心被覆盖或修改

2.配置.htaccess

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

这里可能会发现上面的目录结构中没有zendframework的包,因为我放到了整个项目的外面,只要确保include这个path就可以了。

set_include_path(implode(PATH_SEPARATOR, array(
    //realpath(APPLICATION_PATH . '/../library'),
    realpath(APPLICATION_PATH . "/../../lib/zf1.0"),
    get_include_path(),
)));

lib和D:/wamp/www/Zend-1.0的Zend-1.0是同级的
使程序的访问路径都到index.php这个入口。这一步配置好了,就可以直接输入127.0.0.1:8080查看是否成功显示了。

3.修改了application.ini文件
设置模块路径

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[]=""

使用了mysql的PDO,必须得开启php.ini文件下的;extension=php_pdo_mysql.dll
去掉前面的”;”符号
aplication.ini的具体内容为

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.view.encoding = "UTF-8"

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules[]=""

resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "zf1.0"
resources.db.isDefaultTableAdapter = true
resources.db.params.charset = "utf8"

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1
resources.frontController.throwExceptions = 1

4.在相应的模块下新增Bootstrap.php文件

<?php
class Default_Bootstrap extends Zend_Application_Module_Bootstrap
{
     protected $_moduleName = 'default';

     public function _initAutoload()
     {
         $moduleLoader = new Zend_Application_Module_Autoloader(array(
             'namespace' => 'Default',
             'basePath' => APPLICATION_PATH . '/modules/default',
         ));

        return $moduleLoader;
     }
}

其中Zend_Application_Module_Autoloader默认会加载的目录是

forms/       => Form
models/      => Model
DbTable/ => Model_DbTable
mappers/ => Model_Mapper
plugins/     => Plugin
services/    => Service
views/
helpers  => View_Helper
filters  => View_Filter

As an example, if you have a module with the prefix of “Blog_”, and attempted to instantiate the class “Blog_Form_Entry”, it would look in the resource directory’s “forms/” subdirectory for a file named “Entry.php”.(例如,如果你有一个模块的前缀是“Blog_”,并试图实例化类”Blog_Form_Entry”,它会在”forms/” 资源目录中,以Entry.php命名)

如果你想加入自己需要的资源,你可以使用Zend_Application_Module_Autoloader的resourceTypes,如blog模块下的Bootstrap.php文件

<?php
class Blog_Bootstrap extends Zend_Application_Module_Bootstrap
{
     protected $_moduleName = 'blog';

     public function _initAutoload()
     {
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
           'namespace' => 'Blog',
           'basePath' => APPLICATION_PATH . '/modules/blog',
           'resourceTypes' => array(
              'app' => array('path' => 'apps','namespace' => 'App')
            )
        ));

       return $moduleLoader;
     }
}

5.新增module目录文件
按目录树在相应的目录下新增controllers,models目录,新建controller和model文件就可以了。

到此zendframework多模块配置就结束了。

aplication.ini的一些配置信息的注释:
Zend_Application 提供了一个可重用资源的引导,通用和模块化的引导类和依赖检查。 同时默认负责设置 PHP 环境变量和自动加载功能。
其中的php环境变量的设置

phpSettings.display_errors = 0
phpSettings.error_reporting = E_ALL & ~E_NOTICE
phpSettings.date.timezone="Europe/Prague"

添加额外的include_path目录

includePaths.library = APPLICATION_PATH "/../library"

可以被Zend_Loader_Autoloader实例注册,其中Zend_和ZendX_是会默认被加载的

autoloaderNamespaces.0 = "Zend_"
autoloaderNamespaces.1 = "ZendX_"
autoloaderNamespaces.2 = "php_"

引导程序

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"

其中的数据库设置

resources.db.adapter

// 多重数据库

resources.multidb.db1.adapter
resources.multidb.db2.adapter

zend框架提供了一个用来处理从程序抛出的异常的插件,其中默认是在default模块下。同时也可以指定使用某个错误处理程序,方法如下:

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
'module'     => 'blog',
'controller' => 'error',
'action'     => 'error'
)));

当程序有错误时候,会调用blog模块下的ErrorController.php。这样就可以做到具体模块使用具体的ErrorController了

如果需要自定义数据库适配器类,在application.ini的数据库配置项中新增

resources.db.params.adapterNamespace = “HisenKing”

数据库相关的详细介绍可查看zendframework官方的Zend_Db_Adapter介绍

如有错误,还请告知

参考资料:
《zendframework手册》

http://framework.zend.com/learn

好久没更新了,需要除除草