|
本帖最后由 baiyuxiong 于 2010-1-20 09:11 编辑
英文原文:
http://www.phpandstuff.com/articles/codeigniter-doctrine-from-scratch-day-1-install-and-setup
翻译原文:
http://www.baiyuxiong.com/article/119.htm
http://www.baiyuxiong.com/article/120.htm
这个英文教程是一个系列的,先翻译了第一天的。如果大家觉得翻译质量还行的话,再继续。欢迎转载,请注明出处。
在这个系列教程的第一部分,我将向你展示如何安装Codeigniter及以插件的方式安装doctrine.
为什么要添加Doctrine
在开始之间,我先解释一下为什么要这么做。Doctrine(项目网址:http://www.doctrine-project.org/) 是一个 PHP 的 orM (对象关联映射框架),在这一小节中,你不了解这个也没关系。这基本上意味着你可以把你的数据表映射到WEB程序的类上,这些类的实例代表着数据表中的记录。
这样,处理数据与处理普通对象几乎一样,从数据库中读、写、删除、更新数据将变得很容易。所以你几乎不用写任何查询语句。它也可以处理表之间的关系。还有一些其它的好处我将在后面讲到。如果你现在想了解更多Doctrine的信息,请看它的说明。
下面是一个图示,会给你一些直观的印象。
第一步:安装你的开发环境
如果你已经安装了php和mysql,可以跳过这步。
注意:因为端口冲突skype用户在你启动WAMP之前要关掉skype(国内迅雷用户要关掉迅雷,译者注);WAMP启动后,你可以重新打开skype.
- 创建一个名叫“ci_doctrine_day1”的文件夹,我们的文件将放在这里。
安装CodeIgniter
- 解压,复制内容到ci_doctrine_day1文件夹
你的新文件夹结构应该像这样:
你应该看到:
CodeIgniter 速成: Controllers
每次载入页面时,CodeIgniter就会调用控制器
控制器放在目录:
system/application/controllers/
url结构看起来像这样:
http://localhost/ci_doctrine_day1/index.php/CONTROLLER_NAME/FUNCTION_NAME
例如,你打开这个链接:
http://localhost/ci_doctrine_day1/index.php/hello/world
CodeIgniter 将寻找一个叫做hello的控制器并调用它的world()方法。
来创建我们的第一个控制器。
我们的第一个控制器
创建这个文件: system/application/controllers/hello.php
内容:PHP复制代码
<?php
// system/application/controllers/hello.php
class Hello extends Controller {
function world() {
echo "Hello CodeIgniter!";
}
}
复制代码
访问:http://localhost/ci_doctrine_day1/index.php/hello/world
你将会看到:
注意:
推荐阅读:http://codeigniter.com/user_guide/general/controllers.html
国内用户:http://codeigniter.org.cn/user_guide/general/controllers.html 译者注
安装Doctrine
CodeIgniter允许安装插件。
- 创建文件夹: system/application/plugins
- 创建文件夹:system/application/plugins/doctrine
- 解压文件,找到lib文件夹并复制到system/application/plugins/doctrine下。
现在你的文件夹看起来像这样:
- 创建插件文件:system/application/plugins/doctrine_pi.php
PHP复制代码
<?php
//system/application/plugins/doctrine_pi.php
//载入Doctrine库
require_once APPPATH .'/plugins/doctrine/lib/Doctrine.php';
//从CodeIgniter载入数据库配置
require_once APPPATH .'/config/database.php';
//允许Doctrine自动载入model类
spl_autoload_register(array('Doctrine', 'autoload'));
//把数据库连接载入到Doctrine_Manager
//这个循环允许我们使用多个连接
foreach ($db as $connection_name => $db_values) {
// 首先转换到dsn(Data Source Name:数据源名称 译者注)格式
$dsn = $db[$connection_name]['dbdriver'] .
'://' . $db[$connection_name]['username'] .
':' . $db[$connection_name]['password'].
'@' . $db[$connection_name]['hostname'] .
'/' . $db[$connection_name]['database'];
Doctrine_Manager ::connection($dsn,$connection_name);
}
//需要载入CodeIgniter的Model类
require_once BASEPATH .'/libraries/Model.php';
//告诉Doctrine我们的model类在哪里
Doctrine ::loadModels(APPPATH .'/models');
//下面是配置(可选)
// 允许使用 "mutators"
Doctrine_Manager ::getInstance()->setAttribute(Doctrine ::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
//这个默认设置所有表列为notnull和unsigned(整数有效)
Doctrine_Manager ::getInstance()->setAttribute(Doctrine ::ATTR_DEFAULT_COLUMN_OPTIONS,
array('notnull' => true, 'unsigned' => true));
// set the default primary key to be named 'id', integer, 4 bytes
//设置默认主键名称是id,整数,4字节
Doctrine_Manager ::getInstance()->setAttribute(Doctrine ::ATTR_DEFAULT_IDENTIFIER_OPTIONS,
array('name' => 'id', 'type' => 'integer', 'length' => 4));
复制代码
阅读代码里的注释,如果读不懂也没关系。
数据库安装和配置
- 编辑文件: system/application/config/database.php
PHP复制代码
// in system/application/config/database.php
// ...
$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "ci_doctrine";
// ...
复制代码
我们刚编辑的是CodeIgniter的数据库配置文件。
更多配置
快完了。
Config.php
- 编辑文件:system/application/config/config.php
现在CodeIgniter知道了站点的URL
autoload.php
- 编辑文件:system/application/config/autoload.php
PHP复制代码
// in system/application/config/autoload.php
// ...
$autoload['plugin'] = array('doctrine');
// ...
复制代码
这个可以确保Doctrine插件总是被载入的
搞定!
现在开始测试我们的安装。
我们的第一个Doctrine 模型
创建用户表 - 打开phpmyadmin: http://localhost/phpmyadmin/
- 打开数据库 “ci_doctrine”
- 创建 “user”表,包含以下列:
id => int, primary key, auto_increment,
username => varchar(255), unique,
password => varchar(255),
first_name => varchar(255),
last_name => varchar(255)
可以使用下面的查询语句:
SQL复制代码
CREATE TABLE `ci_doctrine`.`user` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,`username` VARCHAR( 255 ) NOT NULL ,`password` VARCHAR( 255 ) NOT NULL ,`first_name` VARCHAR( 255 ) NOT NULL ,`last_name` VARCHAR( 255 ) NOT NULL ,UNIQUE (`username`)) 复制代码
创建模型 - 创建文件: system/application/models/user.php
PHP复制代码
<?php
// system/application/models/user.php
class User extends Doctrine_Record {
public function setTableDefinition()
{
$this->hasColumn('username', 'string', 255);
$this->hasColumn('password', 'string', 255);
$this->hasColumn('first_name', 'string', 255);
$this->hasColumn('last_name', 'string', 255);
}
} 复制代码
注意: - 我们继承了 Doctrine_Record,而不是 Model (which you normally would with CodeIgniter models).
- 在函数 setTableDefinition()内部, 我们需要定义表结构.
- 默认, Doctrine 会寻找与类名相同的数据表. 这个例子中是: “user”. (这个可以更改)
- 在前面的 doctrine_pi.php文件中, 我们指定了一个默认的主键 “id”. 所以在类里面不需要再次写它.
测试模型:添加一些user
编辑我们刚才创建的控件器: system/application/controllers/hello.php PHP复制代码
<?php
// system/application/controllers/hello.php
class Hello extends Controller {
function world() {
echo "Hello CodeIgniter!";
}
function user_test() {
$u = new User;
$u->username = 'johndoe';
$u->password = 'secret';
$u->first_name = 'John';
$u->last_name = 'Doe';
$u->save();
$u2 = new User;
$u2->username = 'phprocks';
$u2->password = 'mypass';
$u2->first_name = 'Codeigniter';
$u2->last_name = 'Doctrine';
$u2->save();
echo "added 2 users";
}
}[/indent] 复制代码
我们产生了两个对象,并添充了一些数据,简单的调用save() 把他们保存起来。
注意: - 我们能够像访问参数一样数据表的域,尽管我们没有创建这些类的参数。Doctrine 很牛比吧?
- 如果你熟悉CodeIgniter,你可能记得你需要调用 $this->load->model()函数来载入模型。但是,当我们注册了Doctrine的自动载入函数,只要写上new User就可以了。
- 我们没有创建save()函数,因为它来自我们继承的Doctrine_Record 类。它把对象保存到数据库。Doctrine 类还有一些其它的函数和好工具,我们会在后面的教程中看到。
打开: http://localhost/ci_doctrine_day1/index.php/hello/user_test
你应该能看到输出:
打开phpMyAdmin: http://localhost/phpmyadmin/
查看表 ‘user’
你会看到表中刚添加的两条数据。
耐心等待
我们见看到了如何安装带有Doctrine 的CodeIgniter 。这花费了一些功夫,但是现在,我们把强大的MVC框架和ORM结合起来了。
在下一次教程中,我将向你展示更实用的例子并最终创建一个功能性的网站。你将看到用Doctrine 创建模块比在所有模块中重复的写CRUD(Create, read, update and delete)要简单的多。
Doctrine也能帮助我们处理类之间的关系, 避免写复杂的逻辑和查询语句.
下次见!
|
评分
-
查看全部评分
|