创建模
型和数据表
在我们开始之前,让我们
来思考几点:这些类将放在什么地方,我们如何找到它们?我们创建的默认的项目实例化一个自动加载(autoloader)。
我们可以给它附加其他的自动加载(autoloader),所以它知道在哪里可以找到不同的类。典
型的,我们想让我们各种各样的MVC类归入同一个目录树――在这个例子中是application/ ――并且大多数经
常使用共同的前缀(common prefix)。
Zend_Controller_Front 有一个“模块(modules)”概念,它是一个单独的小应
用程序。模块模拟在application/目录下用zf工
具建立的目录结构,且里面所有的类假定有相同的前缀――模块名。“Application/”本身
就是一个模块――“default”或者“application”
模块。因此,我们将去设置在此目录下资源的自动导入。
Zend_Application_Module_Autoloader提供将模块下各种资源映射到相应目录的功能,并且也提供一个标准
的命名机制。在引导对象(bootstrap object)初始化时,这个类的实例被默认创建。
你的应用程序引导程序(bootstrap)将默认的使用“Application”
作为模块前缀。这样,我们的模型、表单和数据表类将以“Applicatin_”为前缀。
Now, let's consider what makes up a guestbook. Typically,
they are simply a list of entries with a comment, timestamp,
and, often, email address. Assuming we store them in a
database, we may also want a unique identifier for each entry.
We'll likely want to be able to save an entry, fetch individual entries,
and retrieve all entries. As such, a simple guestbook model API might
look something like this:
现在,我们来看看是什么
组成了留言簿,典型的,他们简单的由评论(comment),戳(timestamp),经常还包括邮件地址的条目列表。假若将他们存储在数据库中,还要为每一个条目建立一个唯
一的标识符。我们想要保存条目、查询单个条目,检索所有条目。因此,一个简单的留言薄模型API可
能看起来像这样:
// application/models/Guestbook.php
class Application_Model_Guestbook
{
protected $_comment;
protected $_created;
protected $_email;
protected $_id;
public function
__set($name, $value);
public function
__get($name);
public function
setComment($text);
public function
getComment();
public function
setEmail($email);
public function
getEmail();
public function
setCreated($ts);
public function
getCreated();
public function
setId($id);
public function
getId();
}
class Application_Model_GuestbookMapper
{
public function
save(Application_Model_Guestbook $guestbook);
public function
find($id);
public function
fetchAll();
}
__get()和__set()将提供一个提供了一个便捷的机制去访问单个条目属性,代理其他的getter和setter方法(proxy to the other getters and setters),他们也帮助确保对象中只有
白名单属性才是可用的
Find()和fetchAll()提供获取单个条目和能力,而save()负责将条目存储到数据库。
从现在开始,我们能够开
始建立我们的数据库
首先我们需要初始化我们
的数据源。就像布局和视图资源那样,可以为数据源提供配置。我们可以使用“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 file文件,在相应的部分你将会看到下面的行被加进去。
;
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
在wendows系统中,你需要在资源管理器中创建目录并设置对任何人的写权限。
这里我们有一个到数据库
的连接,它连接到位于application/data/目录下的sqlite数据库。我们来设计一个简单的数据表用于存储我们的留言板条目。
-- scripts/schema.sqlite.sql
--
-- You will need load your
database schema with this SQL.
CREATE TABLE guestbook (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
comment TEXT NULL,
created DATETIME NOT NULL
);
CREATE INDEX "id" ON "guestbook" ("id");
为使我们的工作有创意的
(so that we can have some working data out of the box),
我们来创建一些数据行使我们的应用程序更加有趣
-- scripts/data.sqlite.sql
--
-- You can begin populating
the database with the following SQL statements.
INSERT INTO guestbook (email, comment, created) VALUES
('ralph.schindler@zend.com',
'Hello!
Hope you enjoy this sample zf application!',
DATETIME('NOW'));
INSERT INTO guestbook (email, comment, created) VALUES
('foo@bar.com',
'Baz
baz baz, baz baz Baz baz baz - baz baz baz.',
DATETIME('NOW'));