Zend Framework是php框架中的战斗机。各种功能应有尽有,没有的网上也能找到插件,helper, filter….而对于这样庞大的框架,最重要的就是配置了。
最近我作了一些尝试,在Zend Framework下使用AMF。现在把一些主要点共享给大家。
Tip 1,项目结构
这是刚接触ZF的同学们最头疼的。网上众说纷纭,其实很简单。
ZF发布的时候,bin目录下带有几个可运行的命令文件(包含各种系统了)。直接运行就可以了。
在这里,我是这样使用的(Mac Osx):
Yang:~ daniel$ ./zf.sh create project website
运行后,就会得到一个类似于这样的目录结构。
这里有个提示,尽管你可以把Zend文件夹(ZF的主要库文件)copy到刚才生成项目目录下的library里,我还是建议,一个服务器上维持一个ZF lib,这样升级起来容易。
现在可以把web服务器的服务地址只想我们生成目录bravo的public—这样,用户只能访问这个piblic目录中的文件,而程序文件是在application目录的,主要是安全。
好,打开浏览器,按照你配置的url来访问,应该能看到一个ZF生成的简单页面了。
Tip 2 index.php配置
ZF生成的public目录中,有一个index.php文件。这个文件是ZF应用的入口。这里的配置,主要是一些常量和ZF lib的位置。
比如我就是这样配置的:
- <?php
- // Define path to application directory
- defined('APPLICATION_PATH')
- || define('APPLICATION_PATH',
- realpath(dirname(__FILE__) . '/../application'));
- // Define application environment
- defined('APPLICATION_ENV')
- || define('APPLICATION_ENV',
- (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV')
- : 'production'));
-
- // Defile the path to the public
- define('PUBLIC_PATH', realpath(dirname(__FILE__)));
- //Add library directory to the include_path
- set_include_path(implode(PATH_SEPARATOR, array(
- dirname(dirname(__FILE__)) . '/library',
- get_include_path(),
- )));
- //这个是amf service的目录
- define('SERVICES_PATH', APPLICATION_PATH . '/services');
- define('APPLICATION_INI', APPLICATION_PATH.'/configs/application.ini');
- define('APPLICATION_INC', APPLICATION_PATH.'/data/cache/configCache.php');
- // Zend_Application
- require_once 'Zend/Application.php';
- // Create application, bootstrap, and run
- $application = new Zend_Application(
- APPLICATION_ENV,
- loadConfigCache(APPLICATION_INI, APPLICATION_INC, APPLICATION_ENV));
- $application->bootstrap()
- ->run();
- //配置缓存处理函数返回路径
- function loadConfigCache($ini, $inc, $environment){
- if (!file_exists($inc)) {
- if ( !file_exists(dirname($inc)) || !is_writable(dirname($inc))) {
- throw new Exception('Specified file is not writeable (' .$inc.')');
- }
-
- require_once 'Zend/Config.php';
- require_once 'Zend/Config/Ini.php';
- $config = new Zend_Config_Ini($ini, $environment);
- $configs = '.PHP_EOL.'return '.var_export($config->toArray(), true).PHP_EOL.'?>';
- file_put_contents($inc, $configs);
- }
- return $inc;
- }
Tip 3 配置文件
ZF生成的application.ini文件位于/application/configs/下, 这个目录也经常会放其他配置文件,如route,i18n等。
配置文件一定不能乱了。我们按照dev, prod两种环境来配置。
- [general]
- ;includePaths.library = APPLICATION_PATH "/../../library"
- bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
- bootstrap.class = "Bootstrap"
- resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
- ;database resources.db.adapter = "PDO_MYSQL"
- resources.db.isdefaulttableadapter = true
- resources.db.params.driver_options.1002 = "SET NAMES UTF8;"
- [development : general]
- phpSettings.display_startup_errors = 1
- phpSettings.display_errors = 1
- resources.db.params.host = localhost
- resources.db.params.username = bravo
- resources.db.params.password = Z4wL6h8pA4KS5yDZ
- resources.db.params.dbname = bravo
- [production : general]
- phpSettings.display_startup_errors = 0
- phpSettings.display_errors = 0
- resources.db.params.host = 127.0.0.1
- resources.db.params.username = test
- resources.db.params.password = test
- resources.db.params.dbname = test
Tip 4 AMF 服务的编写
这个很简单。
不需要继承任何类。
顺便说说gateway的提供。ZF中,gateway是一个controller。里面的内容比较常规:
- <?php
- class GatewayController extends Zend_Controller_Action
- {
-
- public function init()
- {
- $this->getHelper('ViewRenderer')->setNoRender();
- }
- public function indexAction()
- {
- $server = new Zend_Amf_Server();
- $server->setSession('Bravo');
- Zend_Session::start();
-
- //让amf服务支持session
- $server->addDirectory(SERVICES_PATH);
- //index.php中声明的,服务所在的目录
- //类的映射。
- $server->setClassMap('com.bravo.model.User', 'Brava_Model_User');
- echo($server->handle());
- }
- }
Tip 5 Bootstrap
最主要的是初始化name space和数据库连接
- protected function _initAutoload()
- {
- $autoloader = new Zend_Application_Module_Autoloader(array(
- 'namespace' => 'Bravo',
- 'basePath' => dirname(__FILE__),));
- return $autoloader;
- }
- protected function _initExtraConfig()
- {
- $resource = $this->getPluginResource('db');
- $db = $resource->getDbAdapter();
- Zend_Registry::set('db',$db);
- Zend_Registry::set('configSection',APPLICATION_ENV);
- }
Tip 6 Value Object的传输
最让我头疼的。我现在的做法是,不使用ZF的Model, 直接用DbAdapter.
所以,我在Model里定义的其实是VO.
定义一个Base:
- <?php
- class Bravo_Model_Base
- {
- public function setData($place){
- foreach($this as $key=>$value){
- if( array_key_exists($key, $place)){
- $this->$key = $place[$key];
- }
- }
- }
- }
那么, User的Model就是:
- <?php
- class Bravo_Model_User extends Bravo_Model_Base
- {
- public $_explicitType = 'com.bravo.model.User';
- public $id;
- public $email;
- public $nickname;
- public $passwd;
- public $avatar;
- }
在从数据库中取得数据后:
- public function getPlace($i){
- $db = Zend_Registry::get('db');
- $select = $db->select();
- $select->from('place')->where('place.id='. $i);
- $p = $db->fetchRow($select);
- $pvo = new Bravo_Model_Place();
-
- //就可以这样了
- $pvo->setData($p);
- return $pvo;
- }
下一篇我们说客户端-应该是很简单了。
阅读(2543) | 评论(0) | 转发(0) |