【PHP-ZF】基础知识学习笔记(一)

摘要:-  zendframework官网 class 1  初步认识php zendframework 框架、配置开发环境、创建zf项目 1.php常用框架:zendframework,thinkphp(国人开发),yii(外企用的较多),cakephp 2.mvc框架:model 模型,view 试图,controller 控制器 3.zf的优势:固定的文件夹归类,程序更加规范化,开

- zendframework官网

class 1 初步认识php zendframework 框架、配置开发环境、创建zf项目

1.php常用框架:zendframework,thinkphp(国人开发),yii(外企用的较多),cakephp

2.mvc框架:model 模型,view 试图,controller 控制器

3.zf的优势:固定的文件夹归类,程序更加规范化,开发效率提高了,程序的可读性增加,可维护性增加等等,不足之处就是配置比较复杂。

596913.jpg

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服务器

---------------------------------------------------------------------------------------------------------

class 2zend原理剖析、程序调试、zend整合数据库

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重写规则,保证项目只有一个入口文件(存在不理解的问题,待解决)

---------------------------------------------------------------------------------------------------------

class 3Zend Framework 中 layout和view详解

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,然后输出变量

publicfunctionindexAction() { //actionbody //为变量赋值 $this->view->a="Hay"; $this->view->b="bbb"; $this->view->c="ccc"; }

 

从上边的程序可以看出来,用此方式赋值特麻烦,要多次赋值。可以将变量放进一个数组或者对象中。assign()方法呢就允许通过数组或者对象赋值:

publicfunctionindexAction() { //actionbody $array=array( \'a\'=>"Hay", \'b\'=>"bbb", \'c\'=>"ccc", ); $this->view->assign($array); }

 

其效果和上边效果是一样的,那么通过对象赋值就有点小不一样了,就是要先把对象转型为数组:

publicfunctionindexAction() { //actionbody $obj=newstdClass(); $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&#39’);
Result: http://localhost/hoge/foo/bar
$this->_redirect(\'http://localhost/hoge/foo/bar?a=1&b=2&#39\');
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\');将会报错

---------------------------------------------------------------------------------------------------------

class 4 ZendFramework 如何引入css、图片、及js代码

虚拟目录指向 public 目录:

引入图片时,可以设置虚拟目录,用\'/images/a.jpg\'这样的方式来引入public目录下的图片,css等内容。

虚拟目录指向非 public 目录:

解决:方法是使用绝对路径来引入css,这样就绝对错不了了,因此考虑设置一个常量,路径直指public

步骤一:Bootstrap.php 由于这个文件每次都被调用,所以就把常量设到这里了,代码如下

<?php classBootstrapextendsZend_Application_Bootstrap_Bootstrap{ publicfunction__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 classAdminControllerextendsZend_Controller_Action{ publicfunctionindexAction(){ $this->view->public=__PUBLIC__;//分配到MVC中的“V”也即视图 $this->render(\'index\');//可以不写 } } ?>

 

步骤三:视图中代码 index.phtml

<linkrel="stylesheet"type="text/css"href="<?phpecho$this->public;?>/style/admin.css"/>

 

P.S.火狐浏览器、google的chrome 不支持绝对路径,使用下面的代码,更换步骤一中代码,其他不变

 

<?php classBootstrapextendsZend_Application_Bootstrap_Bootstrap{ publicfunction__construct($application){ parent::__construct($application); $url=$_SERVER[\'SCRIPT_NAME\']; $url=dirname($url); $url=str_replace(\'\\\',\'/\',$url); define(\'__PUBLIC__\',$url); } } ?>

 

 

---------------------------------------------------------------------------------------------------------

class 5 ZendFramework 配置链接MySQL实例

在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=newZend_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);