《应用Yii1.1和PHP5进行敏捷Web开发》

第四章:迭代1:创建初始TrackStar应用

在上一章中,我们介绍了开发方法,这是一个迭代的方法。对我们而言,一次迭代可以看作是一个开发团队从创建项目到测试项目,最终部署到生产环境整个的时间段。开发人员和其他项目干系人决定哪些功能将在这段时间内完成。这本书不能真正的帮我们建立这样一个时间段。因此,我们在每章定义我们自己的迭代。

从现在起,以后的每一章,我们将看作一个新的迭代,并在每章的开始都有一个迭代计划的部份。在这个部份我们将要:

  • 在本次迭代中,把重点放到确定特性和功能。
  • 提供一些必要的前期设计和分析,快速将项目开发任务细化到每一个小项。

迭代计划

在前一章我们了解了什么是任务跟踪系统,我们将要建立这样一个基础Web的程序。在第二章,我们还了解到如何使用yiic在命令行下创建一个新的Yii程序。

在第三章,我们也谈到了数据,但没有特别说明如何处理这些数据。现在就来回答在第三章提出的问题。我们需要持久化数据吗?关系数据库会像文件一样好吗?

一个基于网络的应用程序一般需要存储,检索和操作信息,我们可以有把握地说,我们坚持在这个程序上使用这些性质。同样,存在不同类型的关系数据,我们需要获取与管理这些数据。我们觉得,最好的办法是将数据存储在关系数据库中,PHP开发人用考虑到Yii框架的兼容性,一般使用简单易用,价格低廉的 MySQL数据库。

我们想在首次迭代中,获得一个可以成功连接数据库的应用程序的基本骨架。所以,我们在这次迭代中将关注以下的基本任务:

  • 根据TaskStar创建一个新的Yii程序
  • 在MySQL中创建一个新的数据库
  • 配置新的应用程序使它可以连接到新的数据库

在第二章,我们已经看到创建一个新的应用程序是多么的简单,虽然首次迭代时间很短,但在结束时,我们将要做测试和部署Web应用的工作。

创建应用程序

首先要做的是创建一个最基本Yii应用程序。在第二章,我们已经了解了,这很容易就可以做到,让我们先确定下列事项:

  • YiiRoot 是Yii框架所在目录
  • WebRoot 是你的Web服务器配置的文档根目录(比如:http://localhost/

下面,在命令行,进入到WebRoot目录,并执行以下命令:

% cd WebRoot
% YiiRoot/framework/yiic webapp trackstar
Create a Web application under '/Webroot/trackstar'? [Yes|No] Yes

上面的执行结果,为我们创建了基本的目录结构和一个Yii的基本应用程序。访问下面的URL,你应该能够看到新的应用程序:http://localhost/trackstar/index.php?r=site/index

连接数据库

现在,我们已经有了一个基本的可运行的应用程序,下面让这个应用程序连接到一个数据库。虽然这个工作主要是配置问题。我们将遵循测试优先的原则,使连接数据库成为我们常规测试的一部份。

测试连接

在第三章中,我们已经了解了Yii提供的测试框架。所以,我们知道在protected/tests/unit/下添加一个测试文件,让我们在这个目录下创建一个简单的测试数据库连接的测试文件DbTest.php。并添加如下内容:

<?php
class DbTest extends CTestCase
{
     public function testConnection()
     {
        $this->assertTrue(true);
     }
}

在这里,我们添加了一个非常普通的测试代码,assertTrue()方法是PHPUnit中定义的,断言是如果参数为true将通过,false则失败。因此,在这种情况下,它传的是true所以这个测试会通过。我们编写测试文件做是为了确保我们新的应用程序工作正常。进入测试目录,并执行这个新的测试:

%cd /WebRoot/trackstar/protected/tests
%phpunit unit/DbTest.phpTime: 0 seconds, Memory: 10.00Mb
 
OK (1 test, 1 assertion)

配置测试套件
如果由于某种原因,在你的系统测试失败,你可能需要修改protected/tests/bootstrap.php中的变量$yiit正确指向your/YiiRoot/yiit.php。

相信在新建的TrackStar应用程序中测试文件已经可以运行了,下面我们可以测试一个数据库连接。

修改testConnection方法中的assertEquals(true)语句为如下代码:

$this->assertNotEquals(NULL, Yii::app()->db);

并再次运行测试

%phpunit unit/DbTest.php
There was 1 error:
1) DbTest::testConnection
CDbException: CDbConnection failed to open the DB connection: could not
find driverFAILURES!
Tests: 1, Assertions: 0, Errors: 1.

现在我们有一个失败的测试,这个测试是假设应用程序已经配置了数据库连接组件db。(后面我们将会讨论更多关于应用程序组件问题)。该测式断言,当应用程序与db连接时,其结果不为空值。

事实上,自动创建的应用程序已经使用了一个数据库,使用yiic工具生成的应用程序为我们配置了一个SQLite数据库。你可以查看protected/config/main.php文件,大约在中间部份有如下声明:

'db'=>array(
            'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/yiibook.db',
        ),

而你也可以验证protected/data/testdrive.db是否存在,这个配置是SQLite数据库所使用。

在我们的例子中,这个测试失败是因为我们的开发环境没有配置SQLite的驱动。如果你的开发环境有正确的驱动,那么这个测试可能在你的机器上没有失败。我们修改配置使用MySQL做为数据库服务器,下面让我们简单介绍一下Yii与普遍使用的数据库。

Yii和数据库

Yii 提供了与数据库编程的大力支持。Yii数据访问对象(DAO)是建立在PHP数据对象(PDO)扩展(http://php.net/pdo)基础之上。这是一个数据库抽象层,应用程序与数据库交互与具体选择的数据库相对独立。所有支持的数据库管理系统(DBMS)使用了统一的接口。通过这种方式,可以保持独立的数据库的代码。应用程序使用Yii中的DAO可以很容易地切换使用不同的DBMS。

要建立一个支持DBMS的连接,可以简单的实例化CDbConnection类:

$connection=new CDbConnection($dsn,$username,$password);

这里$dsn的变量的格式取决于具体被使用程序所采用的PDO驱动程序。一些常见的格式包括:

  • SQLite:sqlite:/path/to/dbfile
  • MySQL:mysql:host=localhost;dbname=testdb
  • PostgreSQL:pgsql:host=localhost;port=5432;dbname=testdb
  • SQL Server:mssql:host=localhost;dbname=testdb
  • Oracle:oci:dbname=//localhost:1521/testdb

CDbConnection是继承自CApplicationComponent,这使得它能够被配置为应用程序组件。这意味着我们可以将它到添加到应用程序做为组件属性,并在配置文件中自定义类和属性的值。这是我们首选方式。

添加一个数据库连接作为应用程序的组件

当我们刚刚创建基本的应用程序时,我们指定应用程序类型是一个Web应用程序。这样实际是指明根据每个请求创建应用程序的单例类 CWebApplication,这个单例类例处理整个应用程序范围内的所有请求。其主要的任务是将用户的请求路由到一个适当的控制器中进行下一步处理。关于路由的问题你可以回到第一章了解。这个单例类也可以作为中心地,保存应用程序级别的配置值。

定制应用程序配置,我们通常会提供一个配置文件,当应用程序实例被创建时初始化它的属性,这个主应用程序的配置文件位于 /protected/config/main.php。这实际上是一个PHP文件,包含一个键值对的数组。每个键代表应用程序实例的一个属性,每个值的名称是对应的属性的初始值。如果你打开这个文件,你会看到由yiic工具为我们配置好的一些设置。

在配置中添加一个应用程序组件非常容易,只需要打开主配置文件,然后找到组件的属性。

我们看到,配置文件中已经指定日志和用户的组件。这此将在后面的章节讲到。我们还看到(就像我们前面提到的),有一个DB组件,配置为使用SQLite连接到一个SQLite数据库protected/data/testdrive.db。我们将用一个MySQL数据库替换这个连接。它的定义如下:

// application components
'components'=>array(
    …
    'db'=>array(
        'connectionString' => 'mysql:host=127.0.0.1;dbname=trackstar_dev',
        'emulatePrepare' => true,
        'username' => 'your_db_user_name',
        'password' => 'your_db_password',
        'charset' => 'utf8',
    ),
),

这里假设了本地(127.0.0.1)MySQL数据库中已经建创建一个名为trackstar_dev库。其中一个很大的好处是从现在起可以使用这个应用组件,我们可以参考数据库连接作为Yii主程序的一个属性:Yii:app()->db可以使用在我们应用程序中的任何位置。同样,我们可以将任何组件的配置定义在配置文件中。

我们所有的例子都将使用MySQL数据库。但是,我们将提供DDL语句创建表结构,我们尽力让它通用于其它数据库,你可以选择使用与Yii兼容的数据库。在编写时,Yii有Active Record支持MySQL, PostgresSQL, SQLite, SQL Server, Oracle。

CharSet属性设置为utf8字符集用于数据库连接,此属性仅用于MySQL和PostgreSQL。我们在这里设置,以确保使用正确的utf8字符支持我们的PHP应用程序。 emulatePrepare=>true这个配置设置一个PDO属性(PDO::ATTR_EMULATE_PREPARES)为true,建议如你使用PHP5.1.3或更高版本。

因此,我们指定了一个名为trackstar_dev的MySQL数据库以及需要连接该数据库的用户名和密码。我们并没有告诉你如何创建这样的 MySQL,我们假设你已经有一个喜欢的数据库并知道如何创建一个新的数据库。如果你不确定如何创建一个新的trackstart_dev数据库以及定义用户名和密码连接数据库,请参阅你的特定数据库文档。

一旦建立了数据库,我们可以再次运行单元测试。

%phpunit unit/DbTest.php
PHPUnit 3.3.17 by Sebastian Bergmann.
Time: 0 seconds
OK (1 test, 1 assertion)

现在测试已经通过了

小结

我们已经完成了第一个迭代,我们的工作完成了测试应用程序,如果有必要,它可以随时部署。然而,我们的应用程序现在当然做不了很多的事情。我们现在拥有的所有功能,包括一个有效的数据库连接,都是在创建应用程序由yiic自己动生成的。这当然远远没有达到我们介绍TaskStar时所描述的功能。但是,我们正在渐渐的实现我们所需要的功能,而首次迭代是实现最终目标的一个伟大的里程碑。

在下一章,我们将终于进入更有意思的功能。我们将开始做一些实际的编码,因为我们需要确实管理我们的项目实体的功能。

评论 X

      友荐云推荐
      Copyright 2011-2014. YiiBook.com