用户
 找回密码
 入住 CI 中国社区
搜索
查看: 31079|回复: 32
收起左侧

[中级] 从头学CodeIgniter和Doctrine系列 第一天【翻译】

    [复制链接]
发表于 2010-1-20 09:04:07 | 显示全部楼层 |阅读模式
本帖最后由 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,可以跳过这步。
  • 下载WAMP

注意:因为端口冲突skype用户在你启动WAMP之前要关掉skype(国内迅雷用户要关掉迅雷,译者注);WAMP启动后,你可以重新打开skype.

  • 打开WAMP安装目录下的WWW文件夹

  • 创建一个名叫“ci_doctrine_day1”的文件夹,我们的文件将放在这里。


安装CodeIgniter
  • 下载CodeIgniter

  • 解压,复制内容到ci_doctrine_day1文件夹

  • 可以删除user_guide文件夹


你的新文件夹结构应该像这样:



你应该看到:


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
你将会看到:
HTML复制代码
 
Hello,Codeigniter!
 
复制代码

注意:
  • 类必须继承Controller

  • 类名第一个字母必须大写

  • 文件名必须小写


推荐阅读: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

  • 下载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));
 
 
复制代码


阅读代码里的注释,如果读不懂也没关系。

数据库安装和配置


  • 创建一个名叫ci_doctrine的数据库

  • 编辑文件: 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
PHP复制代码
 
// in system/application/config/config.php
// ...
 
$config['base_url'] = "http://localhost/ci_doctrine_day1/";
 
// ...
 
复制代码


现在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
你应该能看到输出:
HTML复制代码
 
added 2 users
复制代码


打开phpMyAdmin: http://localhost/phpmyadmin/
查看表 ‘user’
你会看到表中刚添加的两条数据。

耐心等待
我们见看到了如何安装带有Doctrine 的CodeIgniter 。这花费了一些功夫,但是现在,我们把强大的MVC框架和ORM结合起来了。
在下一次教程中,我将向你展示更实用的例子并最终创建一个功能性的网站。你将看到用Doctrine 创建模块比在所有模块中重复的写CRUD(Create, read, update and delete)要简单的多。
Doctrine也能帮助我们处理类之间的关系, 避免写复杂的逻辑和查询语句.
下次见!

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2015-3-26 09:41:17 | 显示全部楼层
为什么我下载的版本system目录下没有application目录的?
发表于 2010-1-20 13:25:28 | 显示全部楼层
沙发先坐坐
发表于 2010-1-20 21:22:57 | 显示全部楼层
很好 它的一系列教程我也看完了 呵呵
发表于 2010-1-24 13:33:41 | 显示全部楼层
我觉得数据库层有ORM来帮忙还是很有必要的。
CI的Model层太简单了。。。
发表于 2010-1-24 17:12:48 | 显示全部楼层
kahana框架的orm我上次看我个朋友用
哇 真的对于处理复杂点的数据库关系的时候 大大提高效果效率啊
发表于 2010-1-25 00:27:27 | 显示全部楼层
好啊,我最讨厌写CRUD了,是不是用这个就可以节省很多时间啊?
 楼主| 发表于 2010-1-25 14:35:48 | 显示全部楼层
用orm影响性能。
发表于 2010-1-26 08:44:11 | 显示全部楼层
杯具了
我已经翻译到第九节了
 楼主| 发表于 2010-1-26 08:55:08 | 显示全部楼层
重复劳动了……


杯具了
我已经翻译到第九节了
kissmumu 发表于 2010-1-26 08:44
发表于 2010-1-27 15:50:24 | 显示全部楼层
弱弱的问一下 ,要在hello.php中创建user的对象$u,不用导入user.php吗?
我按照教程做下来之后出错:Fatal error: Class 'User' not found in D:\wamp\www\CIproject\system\application\controllers\hello.php on line 18
就是$u = new User;这一行。
那位高手帮我解释一下,我是菜鸟...

本版积分规则