本文的最新版本请见:
说明:
这个例子实现的功能很简单,它分成了两个模块,每个模块都有一个控制器,每个控制器都只对应着一个Action,具体可以看目录结构.
1,目录结构
2,Index文件(启动文件)说明
error_reporting(E_ALL|E_STRICT);
//date_default_timezone_set('Europe/London');
//配置类库路径及模型库的路径
set_include_path( './lib' //类库路径
. PATH_SEPARATOR . './app/default/models/'
. PATH_SEPARATOR . './app/user/models/'
. PATH_SEPARATOR . get_include_path()
);
print_r(get_include_path());
echo "
PATH_SEPARATOR".PATH_SEPARATOR;
//Zend_Loader类中有静态方法loadClass使我们能够加载其他类
include "Zend/Loader.php";
/*
类名将会根据下划线(作为目录分隔线)对应到相应目录下的PHP文件,比如Container_Tree会指向Container/Tree.php。
如果$dirs是一个字符串或数组, Zend_Loader::loadClass()会根据顺序查找相应目录,并加载第一个匹配的文件。如果文件不存在,则会查找inculde_path指定的目录。
如果文件不存在或者文件中相应的类不存在,那么Zend_Loader::loadClass()就会抛出一个Zend_Exception异常。
类名中只能包含字母,连接符-、下划线_和句点.
*/
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');
//类Mylib_Db是自己写的一个类,路径为“lib/Mylib/Dd.php”,具体见后面的源码
Zend_Loader::loadClass("Mylib_Db");
// 设置数据库
include "./app/config.ini.php"; //引入配置文件,源码见附录
$registry = Zend_Registry::getInstance();
$registry->set('config', $config); //注册变量,以后就可以使用Zend_Registry::get('config')来引用了
$db = Zend_Db::factory($config['db']['adapter'], $config['db']['ini']); //链接数据库
Zend_Db_Table::setDefaultAdapter($db); //注册数据库对象$db,至于为什么要注册,我也不清楚
print_r($registry->get('config'));
echo "
";
// setup controller
$frontController = Zend_Controller_Front::getInstance(); //取得控制器的实例对象
$frontController->throwExceptions(true); //抛出所有异常,这个对于测试非常重要
//$frontController->setBaseUrl("/webqq");
//设置控制器目录,"default"和"user"就是模块名,而对应的就是模块的控制器路径
//实现“/模块名/控制器名/Action名/”形式的路径跳转
$frontController->setControllerDirectory(array(
'default' => './app/default/ctrls',
'user' => './app/user/ctrls',
//'news' => '../application/news/controllers'
));
//据说加了这个就可以适用模块功能,不过好像没有什么用处,不知道是不是我理解错了
$frontController->setParam('useModules', true);
//设置路由器,通过这个就可以实现页面的跳转调用,从而找到相应的控制器,
//例如输入“/user/news/show/”,系统就可以识别user是模块名,news是控制器名,show是Action名
Zend_Loader::loadClass('Zend_Controller_Router_Rewrite');
Zend_Loader::loadClass('Zend_Controller_Dispatcher_Standard');
$frontController->setRouter(new Zend_Controller_Router_Rewrite())
->setDispatcher(new Zend_Controller_Dispatcher_Standard());
print_r($frontController);
echo "
";
// run!
$frontController->dispatch();
3,Mylib_Db类
//实现数据库操作的一些基本配置,例如设置数据表的前缀等
class Mylib_Db extends Zend_Db_Table
{
public function __construct() {
$config = Zend_Registry::get('config');
$this->_name = $config['db']['prefix'].$this->_name;
parent::__construct(); //调用父类的构造方法
}
}
?>
4,配置文件
//$config会在idnex文件中被注册到注册表,以后就相当于全局变量
//$config['db']是数据库相关的参数
//$config['db']['ini']是数据库链接需要的基本参数
$config['db']['adapter'] = "PDO_MYSQL";
$config['db']['ini']['host'] = "localhost";
$config['db']['ini']['username'] = "webqq";
$config['db']['ini']['password'] = "111111";
$config['db']['ini']['dbname'] = 'webqq';
//说明:这是数据表的前缀,变量名最好不要改变,如果改变的话一定得相应的改变类Mylib_Db中的变量
$config['db']['prefix'] = "wqq_";
?>
5,default模块
作为例子,这个模块只有一个功能,重要的文件只有两个:
(1)一个是控制器(Index控制器)文件
class IndexController extends Zend_Controller_Action {
private $_user = "";
function init(){
$this->initView(); /*视图初始化,产生视图对象$this->view,这样在视图文件中就可以这样使用:例如在这里设置好$this->view->title之后,在视图文件中就可以用$this->title来获得title的值了*/
$this->view->baseUrl = $this->_request->getBaseUrl(); /*获得url,在视图中需要加载其他文件(例如JS,CSS文件等)时要用*/
Zend_Loader::loadClass('Default_User'); //加载model类
$this->_user = new Default_User();
}
function indexAction(){
$this->view->title = "webqq";
$this->view->users = $this->_user->fetchAll();
$this->view->render(); //更新视图
}
function noRouteAction(){
$this->_redirect("/");
}
}
?>
(2)另一个是model文件
//model类库中的类这样命名比较好:{模块名}_{model名}。
/*
model名最好不要相同,就算不是在同一个文件夹下的model名也不要相同,因为这个命名空间({模块名}_{model名})和lib类库里面那些的命名空间不一样。在include_path中的是这样的“./app/default/models”,而这个文件夹下面就直接是model的源文件了,沿着这个路径就直接找到文件了。如果有同名的话只会加载前一个文件
*/
class Default_User extends Mylib_Db
{
protected $_name = 'user'; //在Mylib_Db中会自动加上表名的前缀
protected $_primary = 'uid'; //主键
}
?>
当然,少不了的还有一个视图文件“views/index/index.phtml”,就不详述了。
6,user模块
和上面模块的设置基本相同,不同的只有控制器类的类名,需要加上模块名作为前缀,例如“User_IndexController”。(作为例子,这两个模块的功能完全一样)这里就不再详述了。
7,常见错误
(1)"Uncaught exception 'Zend_View_Exception' with message 'script 'index/checklogin.phtml' not found in path。。。。。"就是说找不到相应的视图文件,就算我的action是什么也没做的,在相应的视图文件夹里加上'index/checklogin.phtml'应该就没事了。
(2)“Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller class ("Index_IndexController")' in 。。。。。”找不到相应的controller文件,可能是路径错了,或者controller的类名写错了。
(3)数据库操作的乱码问题
解决办法:在获取数据库链接对象的后面(一般在启动文件中)加上“$db->query("SET NAMES gbk");”,其中gbk你可以设置为你需要的字符集,例如utf-8等。
阅读(1645) | 评论(0) | 转发(0) |