Zend Framework 1.10.1 快速入门之四:创建一个模型和数据库表格

在我们开始之前,让我们思考这样一些问题:这些类将放在什么地方,我们如何找到他们?我们创建的默认项目实例化一个自动加载器(autoloader)。我们可以把其他的自动加载器附加到它身上,这样它知道到哪里找到不同的类。典型的,我们想让我们大量的 MVC 类在同一个树状结构下分组--在本例中,是 application/--而且大部分情况使用一个通用前缀。

Zend_Controller_Front 有一个模块(modules)的理念,这些模块是独立的迷你应用程序。模块模仿 zf 工具在 application/ 下建立的目录结构,而且在它们(模块)内部的类被假设以一个通用前缀(模块的名字)开头。application/ 本身是一个模块--默认(default)或者应用(application)模块。这样,我们想为在这个目录内的资源创建自动加载。

Zend_Application_Module_Autoloader 提供了必要的功能来把一个模块下大量的资源映射到合适的目录,同时提供了一套标准的命名机制。类的一个实例将在 bootstrap 对象初始化的过程中被默认创建,你的应用程序的 bootstrap 将会默认的使用模块前缀 Application。这样,我们的模型,表单以及表格类将会以 Application 这个类前缀开头。

现在,让我们想一下什么组成了一个留言本。典型的,他们是一些简单的列表,包含有留言,时间,同时,经常的,电子邮件地址。假设我们把它们存储在一个数据库中,我们可能还想为每一个条目分配一个独一无二的标识符(unique identifier)。我们可能还希望可以保存每一个条目,捕获每一个条目,同时检索所有的条目。这样,一个简单的留言本模型 API 可能看起来是这样的:

__get() 和 set__() 将为我们访问独立的列表的属性提供一个方便的机制,同时代理其它的 getter 和 setter。他们同样将帮助确保只有列入我们白名单的属性才能被对象使用。

find() 和 fetch() 提供了捕获一个单独的条目或者全部条目的功能,而 save() 则负责把一个条目保存到数据库中。

从现在开始,我们可开始考虑建立我们的数据库。

首先,我们需要初始化我们的 Db 资源。如同 Layout 和 View 资源,我们可以为 Db 资源提供配置。我们可以使用 zf configure db-adapter 命令来完成:

      % zf configure db-adapter /
      > 'adapter=PDO_SQLITE&dbname=APPLICATION_PATH "/../data/db/guestbook.db"' /
      > production
      A db configuration for the production has been written to the application config file.

      % zf configure db-adapter /
      > 'adapter=PDO_SQLITE&dbname=APPLICATION_PATH "/../data/db/guestbook-testing.db"' /
      > testing
      A db configuration for the production has been written to the application config file.

      % zf configure db-adapter /
      > 'adapter=PDO_SQLITE&dbname=APPLICATION_PATH "/../data/db/guestbook-dev.db"' /
      > development
      A db configuration for the production has been written to the application config file.

现在编辑你的 application/configs/application.ini 文件,在那你可以看到在对应的部分,添加了以下的内容:

      ; application/configs/application.ini

      [production]
      ; ...
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook.db"

      [testing : production]
      ; ...
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-testing.db"

      [development : production]
      ; ...
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-dev.db"

最后你的配置文件看起来应该是这样的:

      ; application/configs/application.ini

      [production]
      phpSettings.display_startup_errors = 0
      phpSettings.display_errors = 0
      bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
      bootstrap.class = "Bootstrap"
      appnamespace = "Application"
      resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
      resources.frontController.params.displayExceptions = 0
      resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
      resources.view[] =
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook.db"

      [staging : production]

      [testing : production]
      phpSettings.display_startup_errors = 1
      phpSettings.display_errors = 1
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-testing.db"

      [development : production]
      phpSettings.display_startup_errors = 1
      phpSettings.display_errors = 1
      resources.db.adapter = "PDO_SQLITE"
      resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-dev.db"

注意数据库将会保存在 data/db/ 中。创建那些目录,同时使它们可写。在 unix 系统中,你可以这样做:

% mkdir -p data/db; chmod -R a+rwX data

在 Windows,你将在文件浏览器中创建这些目录,并设置权限,让任何人都可以写入这个目录。

至此,我们有了一个到数据库的连接,在我们的例子中,这是一个到位于我们 application/data 目录中的一个 Sqlite 数据库的链接。所以,让我们设计一个简单的表格来保存我们的留言本条目。

同时,为了我们能有一些可以操作的数据,让我们创建一些信息来使我们的应用程序更有趣。

现在我们同时定义好了结构和一些数据。让我们创建一个脚本以便我们可以执行从而创建这个数据库。本来,这个在产品中不是必须的,但是这个脚本将帮助开发者创建本地数据库,以便他们拥有全套的工作应用程序。用以下的内容创建 scripts/load.sqlite.php 脚本:

现在我们的留言本应用程序有了一整套运转正常的数据库和表格。下面的几个步骤将创建我们的应用程序代码。包括创建一个数据源(在我们的例子中,我们将使用 Zend_Db_Table),和一个数据映射器来把数据源链接到我们的模型。最后我们还将创建控制器,来和这个模型互动,以便显示存在的条目,同时加入新的条目。

我们将使用一个 Table Data Gateway 来链接到我们的数据源;Zend_Db_Table 提供了这个功能。开始之前,让我们创建一个以 Zend_Db_Table 为基础的表格类。正如我们在 layout 和 database adapter 做的,我们可以使用 zf 工具来帮助我们,使用 create db-table 命令。它将接受至少两个参数,你想指向的类的名字,和它映射的数据库表格。

      % zf create db-table Guestbook guestbook
      Creating a DbTable at application/models/DbTable/Guestbook.php
      Updating project profile 'zfproject.xml'

看看你的目录树,你将会发现一个新目录, application/models/DbTable 被创建了,同时还有 Guestbook.php 文件。如果你打开那个文件,你会看到如下内容:

注意类的前缀:Application_Model_DbTable。我们模块的类前缀,Application_,是第一个部分,然后是我们的组件,Model_DbTable;后面的部分是被映射到模块的 models/DbTable 目录。

当扩展 Zend_Db_Table 的时候,所需要提供的只是一个表格的名字,以及一个可选择的 primary key (如果它不是 id)。

现在让我们创建一个 Data Mapper。一个 Data Mapper 把一个对象映射到数据库。在我们的例子中,它将映射我们的模型,Application_Model_Guestbook,到我们的数据源,Application_Model_DbTable_Guestbook。一个典型的数据映射器(data mapper)的 API 将会是这样的:

除了这些方法,我们将增加设置和检索 Table Data Gateway 的方法。为了创建最原始的类,使用 zf 客户工具:

      % zf create model GuestbookMapper
      Creating a model at application/models/GuestbookMapper.php
      Updating project profile '.zfproject.xml'

现在,编辑在 application/models/GuestbookMapper.php 文件中的 Application_Model_GuestbookMapper 类,将会看到以下内容:

现在是时候创建我们的模型类了。我们可以,再次的,使用 zf create model 命令

      % zf create model Guestbook
      Creating a model at application/models/Guestbook.php
      Updating project profile '.zfproject.xml'

我们会修改这个空的 PHP 类,通过传递一个数据数组给构造函数或者一个 setOptions() 方法,来使它简单的填充这个模型。最后的模型类,在 application/models/Guestbook.php 文件中,看起来象这样:

最后,为了把这些元素链接起来,让我们创建一个 guestbook 控制器,它将列出数据库中现有的条目,同时可以添加新的条目进数据库。

为了创建一个新的控制器,使用 zf create controller 命令:

      % zf create controller Guestbook
      Creating a controller at
          application/controllers/GuestbookController.php
      Creating an index action method in controller Guestbook
      Creating a view script for the index action method at
          application/views/scripts/guestbook/index.phtml
      Creating a controller test file at
          tests/application/controllers/GuestbookControllerTest.php
      Updating project profile '.zfproject.xml'

这将创建一个新控制器,GuestbookController,在 application/controllers/GuestbookController.php 文件中,带有一个单独的行为方法,indexAction()。它同时为这个控制器创建一个视图脚本目录, application/views/scripts/guestbook/,内有与这个 index 行为相对应的视图脚本。

我们使用 index 行为作为一个登陆页面来浏览留言本条目。

现在,让我们更新基本的应用程序逻辑。对于一个 indexAction() 的点击,我们将显示全部的留言本条目。它看起来是这样的:

同时,当然,我们需要一个视图脚本。修改 application/views/scripts/guestbook/index.phtml,如下显示:

注意:检查

现在浏览 http://localhost/guestbook,在你的浏览器中你应该能看到如下内容:

ImageHost.org

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值