1.首先下载zendframework1.x全包解压,前置准备工作略过(开启pdo模块支持。开启rewrite机制 在http-conf中吧 AllowOverride None改成 AllowOverride All共有三处需要修改)
2.打开cmd控制命令行,用cd命令行打开到zendframework的bin,exe预处理命令;比如cd F:\ZendFramework-1.11.1\bin
3.使用命令 zf.bat create project d:\www\zendframework //命令表示创建一个空项目放在:d:\www\zendframework(记住运行命令的首要前提是吧zf.,bat加入环境变量path中);
4.在php的php.ini里面配置错误文件:error_log可以存放错误文件日志;
;error_log = php_errors.log
; Log errors to syslog (Event Log on NT, not valid in Windows 95).
;error_log = syslog
修改为error_log ="d:\phperror.log";去掉分号
控制器:indexcontroller.php里面有各种控制器函数而。init函数就是初始化函数,每新建一个controller类都必须先初始化一次:
也就是继承总的控制器类:
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
而后才能继续添加各种控制器函数;
而bootstrap.php则会进行初始化,相当于一个构造的类;
所有一般流程是先去public下的index.php--->而后浏览bootstrap.php初始化--->而后浏览controller里面的index.php-->最后是执行indexaction函数;
注意在indexAcion 或者xxxAction中,若是什么都没有写,默认是找view/scrionps的对应名称的.phtml文件;($this->rend('index‘)类似的作用;
在这中间最先开始经过的index,php函数相当于总控制器,然后经过的bootstrap相当于初始化函数,而后会找到对应的总控制器
也就是http:\\www.zendframework相当于输入的http:\\www.zendframework\index\index 也就是找到indexController.php中的indexAction函数;
bootstrap相当于一个入口文件:可以在bootstrap.php进行控制器入口的控制,比如通过ip控制是否进入控制器之类的权限;
IndexContriller.php中的init函数可以对自己对应的单个控制器进行初始化工作。
//索引bootstrap相当于对所有控制器进行控制,而init函数则对对应的controller进行初始化和控制;
Zend_Db_Table 是Zend Framework的表模块.它通过zend_db_adapter连接到 数据库,为数据库模式检查表对象,并对该表进行操作和查询.
zend_db_table负责所有数据库的连接,自动关闭连接的功能;是一个很好用的封装好的函数;
Module的名字一般来说和我们的表名保持一致;比如我们的数据库表名为user,则moudele为user.php;
所有的module必须继承Zend_db_table;但是必须先建立表面和主键和对应models的联系
在最之前我们必须对数据库进行连接;
在applicaiton.ini中添加如下的配置文件
[mysql]
db.adapter=PDO_MYSQL
db.params.host=localhost
db.params.username=root
db.params.password=root
db.params.dbname=tstzf
你也可以另外重写config.ini在index.php中require配置文件;
然后在bootstrap对刚刚写的config文件进行载入:
创建适配器
$url=constant("APPLICATION_PATH").DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'application.ini';
$dbconfig=new Zend_Config_Ini($url,"mysql");
$db=Zend_Db::factory($dbconfig->db);
$db->query('SET NAMES UTF8');
Zend_Db_Table::setDefaultAdapter($db);
(在程序里面最耗费资源的部分其实就是连接数据库,所以这一部分其实可以单独写一个控制器,永远优化代码。放在bootstrap中不管你需不需要连接数据库都会进行一次;)
其次,我们建立对表的连接;比如我们要用messag.php这个modles对应message表,我们可以先定义protected $_name='message';protected $_primary='message_id';
然后在需要的用到该表的控制器里面把该modules重新引入;require_onec "../models/Message.php"(这样引入文件有时候会找不到文件,那就用绝对路径来引入;
require_once APPLICATIN_PATH."./models/Message.php"();
这个时候我们就全部配置好连接数据库,建立起对应表的modl层,那么就可以在相应的控制器里面取出我们需要的数据文件;
注意的是要是在数据控制器中new数据库一定要把public init删除 否则有可能产生错误;
在控制器里面实例化对应的数据库表:
$messageModle=new message();
$res=$messageModle->fetchAll()
这样我们就通过fetchAll函数取出数据,这样取出的数据是对象可以用
$res=$messageModle->fetchAll()->toArray();转换为数组;
在取出数据到$res后,我们就把拿到的数据分配给对应的view;
$this->view->res=$res;
对应的phtml页面
<?php foreach($this->res as $message) { ?>
<?=$message[message_id]?>--<?=$message['getter']?>
<php } ?>
通过.htaces的url重写规则可以实现zend的单一入口,因此可以在indx.php的单文件入口中对进入的权限进行控制,,htaces文件主要用到的是正则表达式的匹配。要使url重写规则生效,我们必须首先启动apache的url重写功能。
RewriteRule ^.*$ index.php
意思就是匹配所有用.开始的所有url地址自动匹配为index.php文件,实现所有的网站都以index.php的入口;
注意:我们在写Controller和它的方法的时候xxAction必须前面小写 后面大写;比如testAction:因为我们在输入urlhttp:\zf.com\index\test的时候运用到了一点反射机制;
它会自动的拼接test和Action变成testAction然后找对应的函数,所有名字不能乱写,大小写也不可以乱;
而前面的index会自动的拼接Controller\
现在我们添加一个新的controller;
比如testController.php 首先它必须继承类Zend_Controller_Action 只有这样才能使一个controller;
class test tsttController extends Zend_Controller_Action{
public function init(){
//默认会调用的函数
}
public function loginAction{
echo '用户登录';
}
}
要对应testController控制器 我们必须首先在view下面的scripts文件夹下重新建立一个文件夹,名为test这里面就专门放置test的视图;
URL的对应:
在zf中每一个URL的跳转都必须通过控制器,比如admin下面的index.phtml跳转到additem.phtml就提交href="/admin/additem"就可以完成跳转。
要跨控制器跳转,比如跳转到全局的控制器下,比如adminController里面的某个Action要跳转到globalController下的okAcion下面,$this->_forward('ok','global');
也就是_forward('$action','$controller')就是跳转到某controller下的某个action;
$this->view->info="增加栏目成功";
$this->_forward('ok','global');
在zf中获取表单可以用$this->getRequest->getParam('name');的方法获取表单名为name的表单的值,用这样的好处是当你获取的表单的值为空的时候可以默认为空字符串也可以自己定义;
如:$this->getRequest()->getParam('name','guest');就是当表单为空的时候默认定义为guest的值;
$ip=$this->getRequest()->getServer('REMOTE_ADDR');
可以得到封装好了的IP值,也就是吧$_SEVER['REMOTE_ADDR']把sever全部封装到里面了;