- zendframework官网
1.php常用框架:zendframework,thinkphp(国人开发),yii(外企用的较多),cakephp
2.mvc框架:model 模型,view 试图,controller 控制器
3.zf的优势:固定的文件夹归类,程序更加规范化,开发效率提高了,程序的可读性增加,可维护性增加等等,不足之处就是配置比较复杂。
4.开发环境配置步骤:
1-下载库,
2-创建zf工程(手工创建,使用ZendStudio创建zf项目,使用zf.bat程序创建--进入zf.bat所在目录,使用zf.bat create project 项目路径 创建项目)详细见:http://my.oschina.net/maomi/blog/86080
3-使用zendstudio创建一个空项目
4-把创建的项目结构拷贝到新建的空项目中
5-引入zf库到该项目中,将zf解压后library中的zend包拷贝到library目录下即可
6-配置apache,让它支持zf框架(wamp配置步骤见:http://my.oschina.net/maomi/blog/86076)
6.1开启PDO和PDO相关数据库引擎
;extension=php_pdo_mysql.dll 去掉前面的分号就可以(wamp已经配置好这一点)
6.2开启apache的rewrite模块
在httpd.conf文件中,启用 LoadModule rewrite_module modules/mod_rewrite.so
再将, AllowOverride None 改成 All
7-配置虚拟主机(自定义和wamp安装环境不一样)
自定义:在httpd.conf文件中,启用---->
dns 添加示例: 127.1.10 marong.com // 前面是ip地址,后面是在浏览器中输入的地址
8-重新启动apache服务器
---------------------------------------------------------------------------------------------------------
1.zend原理剖析
hosts 127.0.0.1 marong.com :
浏览器地址 marong.com ----http请求---->apache服务器----转发给index.php------>public/index.php(总控,apache 使用反射机制)-------->controller/indexController.php(分控:init方法默认执行 - indexAction方法执行[可以使用model] - 引入对应模板视图)------------>生成静态页面--------->apache服务器--------->浏览器
2.程序调试
1-使用 file_put_contents在不中断程序的情况下,输出信息到文件,可以随时查看记录
2-可以通过debug工具来完成调试
3-如果提示 require_once()所引用的文件不存在,则可以将文件的引用路径改为绝对路径
如: require_once APPLICATION_PATH.'../models/Message.php';
其中,APPLICATION_PATH是在总控中初始化的全局变量
3.zend整合数据库(示例)
1-在application.ini中配置数据库信息
[mysql]
db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.username = root
db.params.pwd = root
db.params.dbname = test
2-在bootstrap.php中初始化数据库适配器
(最好是新建一个抽象父类baseController,该类专门供其他需要初始化数据库的类来继承,继承该类的子类必须
require_once(‘baseController.php’))
class BaseController extends Zend_Controller_Action{
public function init(){
}
}
注意:http://blog.csdn.net/wang_jingxiang/article/details/6011210 (另一种配置数据库的方法)
3-在models文件夹中编写模型类(模型类文件名应该跟要操作的数据表名称相同)
//设置私有变量,数据库表名和表的主键
4-在indexController的index方法中,实例化模型类并查询数据,将数据传递给模板对象
5-在模板中引用变量
6-在.htaaccess文件中设置url重写规则,将所有以.php结尾的地址都指向 index.php总控文件,让项目只有一个入口
4.新建控制器方法和对应视图
5.注意事项
1-控制器中的方法名(Action前面的单词)必须是小写,否则将无法正常解析
2-必须设置url重写规则,保证项目只有一个入口文件(存在不理解的问题,待解决)
---------------------------------------------------------------------------------------------------------
1、使用Zend_View与Zend_Layout玩布局
layout是非常方便的视图库,这里列举常用的ZF版本为1.11.11的具体用法
在layout中加载其他layout页面
默认的layout页面,nav页面与layout同一个目录
<?php $this->render('nav.phtml') ?>
设置其他layout或关闭:
//设置其他 控制器中的layout $this->_helper->layout->setLayout('japan_layout'); //设置其他 视图中的layout $this->layout()->setLayout('chinese_layout'); //关闭 控制器中的layout $this->_helper->layout->disableLayout(); //关闭 视图中中的layout $this->layout()->disableLayout();
2、如何在controller中传递变量到view,然后输出变量
public function indexAction() { // action body //为变量赋值 $this->view->a = "Hay"; $this->view->b = "bbb"; $this->view->c = "ccc"; }
从上边的程序可以看出来,用此方式赋值特麻烦,要多次赋值。可以将变量放进一个数组或者对象中。assign()方法呢就允许通过数组或者对象赋值:
public function indexAction() { // action body $array = array( 'a' => "Hay", 'b' => "bbb", 'c' => "ccc", ); $this->view->assign($array); }
其效果和上边效果是一样的,那么通过对象赋值就有点小不一样了,就是要先把对象转型为数组:
public function indexAction() { // action body $obj = new stdClass(); $obj->a = "Hay"; $obj->b= "bbb"; $obj->c = "ccc"; $this->view->assign((array) $obj); }
assign()方法还有一种用法就是使用两个字符串作为assign()方法的参数。这样第一个参数为赋值的变量名,第二个参数作为对应的值。如下:
$this->view->assign('a',"Hay"); $this->view->assign('b',"bbb"); $this->view->assign('c',"ccc");
至于视图部分代码如下:index.phtml
<?php echo $this->a."<br>"; echo $this->b."<br><br><br><br>"; echo $this->c."<br>"; ?>
3、禁用视图并输出内容
a、先输出内容再禁用试图
$this->_helper->viewRenderer->setNoRender(true); // 可省略 print_r(Zend_Json::encode(array('error'=>403))); // 输出内容 exit(); // 禁用试图 return; // 可省略
输出结果:
{"error":403}
b、直接禁用试图同时输出内容
$this->_helper->viewRenderer->setNoRender(true); // 可省略 exit(json_encode(array('error'=>403))); return; // 可省略
输出结果:
{"error":403}
c、通过抛出“error”关闭视图
exit(json_encode('error')); //"error" exit('error'); //error
4、render,_forward,_redirect的用法和区别
render:
不指定render
结果:<当前Module>/<当前Controller>/<当前Action>.phtml
$this->render(‘bar’);
Result: <当前Module>/<当前Controller>/bar.phtml
_forward:
$this->_forward(‘bar’);
Result: <当前Module>/<当前Controller>/bar
$this->_forward(‘bar’,’foo’);
Result: <当前Module>/foo/bar
$this->_forward(‘bar’,’foo’,’hoge’);
Result: hoge/foo/bar
$params = array(
‘a’ -> ‘1’,
‘b’ -> ‘2'
);
$this->_forward(‘bar’,’foo’,’hoge’,$params);
Result: hoge/foo/bar/a/1/b/2
_redirect:
$this->_redirect(‘/hoge’);
Result: /hoge
$this->_redirect(‘/hoge/foo’);
Result: /hoge/foo
$this->_redirect(‘/hoge/foo/bar’);
Result: /hoge/foo/bar
$this->_redirect(‘http://localhost/hoge/foo/bar'’);
Result: http://localhost/hoge/foo/bar
$this->_redirect('http://localhost/hoge/foo/bar?a=1&b=2'');
Result: http://localhost/hoge/foo/bar?a=1&b=2
5、placeholder 的使用和设置
placeholder 的使用:官方教程
//在bootstarp中 $this->bootstrap('view'); $view = $this->getResource('view'); //成功调用了placeholder $view ->placeholder('test’) ->setPrefix('<h1>HI</h1>’);
placeholder 的设置:在你的applicateion.ini中加入 resources.view[] = "" ;如果没有这个设置,你的bootstrap中的$this->bootstrap('view');将会报错
---------------------------------------------------------------------------------------------------------
虚拟目录指向 public 目录:
引入图片时,可以设置虚拟目录,用'/images/a.jpg'这样的方式来引入public目录下的图片,css等内容。
虚拟目录指向非 public 目录:
解决:方法是使用绝对路径来引入css,这样就绝对错不了了,因此考虑设置一个常量,路径直指public
步骤一:Bootstrap.php 由于这个文件每次都被调用,所以就把常量设到这里了,代码如下
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function __construct($application){ parent::__construct($application); $url = dirname(__FILE__);//获取当前文件Bootstrap.php目录路径 $url = str_replace('application','public',$url);//把当前路径更换为public路径 $url = str_replace('\\','/',$url);//更改路径中的“\”为“/” define('__PUBLIC__',$url);//定放常量 } } ?>
步骤二:控制器中代码
<?php class AdminController extends Zend_Controller_Action{ public function indexAction(){ $this->view->public=__PUBLIC__;//分配到MVC中的“V”也即视图 $this->render('index');//可以不写 } } ?>
步骤三:视图中代码 index.phtml
<link rel="stylesheet" type="text/css" href="<?php echo $this->public; ?>/style/admin.css" />
P.S.火狐浏览器、google的chrome 不支持绝对路径,使用下面的代码,更换步骤一中代码,其他不变
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function __construct($application){ parent::__construct($application); $url = $_SERVER['SCRIPT_NAME']; $url = dirname($url); $url = str_replace('\\','/',$url); define('__PUBLIC__',$url); } } ?>
---------------------------------------------------------------------------------------------------------
在application/configs/application.ini中添加数据库的配置信息
[production] //在这一行的后面添加数据库连接信息 resources.db.adapter = PDO_MYSQL resources.db.params.host = 127.0.0.1 resources.db.params.username = root resources.db.params.password = resources.db.params.dbname = zend_example
在index.php入口文件中加入:
$config = new Zend_Config_Ini('../application/configs/application.ini','production'); $register = Zend_Registry::getInstance(); $register->set('config', $config); $db = Zend_Db::factory($config->resources->db); Zend_Db_Table::setDefaultAdapter($db);