第02天:建立数据模型
symfony前情提要ob娱乐下载
在第一天在这篇冗长但有趣的教程中,我们了解了如何安装symfony框架、设置新的应用程序和开发环境,以及使用源代码版本控制为代码带来安全性ob娱乐下载。顺便说一下,在第一天生成的应用程序代码可以在askeet SVN存储库中找到:
http://svn.askeet.com/
第二天的目标是定义功能方面的最终结果,勾勒数据模型,并开始编码。这将包括生成一个对象-关系映射,并通过应用程序脚手架交互式地使用它来创建、检索和更新数据库中的记录。
这是相当多的。让我们开始吧。
项目揭幕
你想知道什么?这是个有趣的问题。有很多有趣的问题,比如:
- 今晚我该和女朋友做什么?
- 如何为我的博客带来流量?
- 最好的web应用程序框架是什么?
- 巴黎最实惠的餐厅是哪家?
- 生命、宇宙和一切的答案是什么?
所有这些问题都没有唯一的答案,最好的答案是见仁见智。事实上,只有一个答案的问题通常是最无趣的(比如,1 + 1等于多少?),但却是唯一可以在网络上解决的问题。这不公平。
满足使用.一个致力于帮助人们找到问题答案的网站。谁来回答这些棘手的问题?每一个人。每个人都可以给其他人的答案打分,这样最受欢迎的答案就会得到更多的关注。随着问题数量的增加,将它们分类和分类已经不可能了,所以问题的创建者可以用任何他/她想要的词来标记它,“à la”。del . icio . us.当然,标签的受欢迎程度必须通过标签气泡来表示。如果有人想要关注某个特定问题的答案,他/她可以订阅这个问题的RSS提要。所有这些功能都必须是优雅和轻量级的,因此所有实际上不需要新页面的交互都必须是AJAX类型的。最后,需要一个后端来调节被报告为垃圾邮件的问题和答案,或者人为地推送管理员认为令人鼓舞的问题。
那么你应该问:我不是已经在网上见过这样的网站了吗?如果你真的这么做了,我们就完蛋了,但如果你提到faqts,eHow网站,Ask Jeeves或者类似的东西,没有协作答案,没有AJAX,没有RSS,没有标签,这不是同一个网站。我们在这里讨论的是web 2.0应用程序。
askeet的重要之处在于,它不仅是一个网站,而且是一个任何人都可以下载、安装在家里或公司内部网、调整和添加功能的应用程序。源代码将以开源许可证发布。你的人力资源主管正在寻找一个知识管理系统?你想把你学到的修车技巧都记录下来吗?你不想为你的网站开发一个常见问题版块?不用再找了,因为askeet存在。它会存在的,这就是我们的圣诞礼物。
从哪里开始呢?
那么如何启动symfony应用程序呢?ob娱乐下载这完全取决于你。你可以写故事,做一个计划游戏,找一个搭档做结对编程XP熟练,或者写一份详细的网站说明书,连同所有对象的草图,状态,互动等等如果你是一个UML风扇。
但是本教程并不是一般意义上的应用程序开发,因此我们将从一个基本的关系数据模型开始,逐个添加工作特性。我们需要的是一个可以在每天结束时使用的应用程序,而不是一堆永不输出任何东西的巨大代码。在理想的情况下,我们应该为我们添加的任何特性编写单元测试,但老实说,我们没有时间这么做。有一天将专门讨论单元测试,所以请继续阅读。
对于这个项目,我们将使用一个具有InnoDB表类型的MySQL数据库,以利用完整性约束和事务支持。我们可以在第一步使用SQLite数据库,以避免设置真正的数据库。这只需要对databases.yml
文件,我们把它留给你们作为练习来研究。
数据模型
关系模型
显然,将会有一个“问题”和一个“答案”表。我们需要一个“用户”表,我们将用户对一个问题的兴趣存储在一个“兴趣”表中,并将一个人给出的答案的相关性存储在一个“相关性”表中。
用户必须被识别才能添加问题、评价答案的相关性或声明对某个问题的兴趣。用户添加答案时不需要确认身份,但答案总是会链接到某个用户,这样就可以区分拥有热门答案的用户。没有任何身份证明的答案将被显示为一个普通用户的贡献,称为“匿名懦夫”。实体关系图更容易理解:
注意我们已经声明了acreated_at
字段。ob娱乐下载Symfony识别这些字段,并在创建记录时将该值设置为当前系统时间。这是一样的updated_at
fields:当记录更新时,它们的值被设置为系统时间。
schema.xml
必须将关系模型转换为配置文件,以便symfony能够理解它。ob娱乐下载这就是目的schema.xml
或schema.yml
文件,位于使用/ config /
目录中。ob娱乐下载Symfony支持XML或YAML格式的模式。
有两种方法来编写这个文件:手动,这是我们喜欢的方式,或者从现有的数据库。我们来看看第一个解。
首先,我们需要删除默认安装的YAML示例文件:
$ SVN delete config/schema.yml
的语法schema.xml
,详细解释了推动网站,相对简单:它是一个XML文件,其中<表>
标签包含> <列
,<外键>
而且<指数>
标签。一旦你写了一个,你就可以写所有的。这是schema.xml
对应于前面描述的关系模型:
<?xml版本=“1.0”编码=“utf - 8”? ><数据库的名字=“推动”defaultIdMethod=“本地”noxsd=“真正的”><表的名字=“ask_question”phpName=“问题”><列的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/><列的名字=“user_id”类型=“整数”/><外键foreignTable=“ask_user”><参考当地的=“user_id”外国=“id”/>< /外键><列的名字=“标题”类型=“用longvarchar”/><列的名字=“身体”类型=“用longvarchar”/><列的名字=“created_at”类型=“时间戳”/><列的名字=“updated_at”类型=“时间戳”/>< /表><表的名字=“ask_answer”phpName=“答案”><列的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/><列的名字=“question_id”类型=“整数”/><外键foreignTable=“ask_question”><参考当地的=“question_id”外国=“id”/>< /外键><列的名字=“user_id”类型=“整数”/><外键foreignTable=“ask_user”><参考当地的=“user_id”外国=“id”/>< /外键><列的名字=“身体”类型=“用longvarchar”/><列的名字=“created_at”类型=“时间戳”/>< /表><表的名字=“ask_user”phpName=“用户”><列的名字=“id”类型=“整数”要求=“真正的”primaryKey=“真正的”自动增量=“真正的”/><列的名字=“昵称”类型=“varchar”大小=“50”/><列的名字=“first_name”类型=“varchar”大小=“100”/><列的名字=“last_name”类型=“varchar”大小=“100”/><列的名字=“created_at”类型=“时间戳”/>< /表><表的名字=“ask_interest”phpName=“利益”><列的名字=“question_id”类型=“整数”primaryKey=“真正的”/><外键foreignTable=“ask_question”><参考当地的=“question_id”外国=“id”/>< /外键><列的名字=“user_id”类型=“整数”primaryKey=“真正的”/><外键foreignTable=“ask_user”><参考当地的=“user_id”外国=“id”/>< /外键><列的名字=“created_at”类型=“时间戳”/>< /表><表的名字=“ask_relevancy”phpName=“相关性”><列的名字=“answer_id”类型=“整数”primaryKey=“真正的”/><外键foreignTable=“ask_answer”><参考当地的=“answer_id”外国=“id”/>< /外键><列的名字=“user_id”类型=“整数”primaryKey=“真正的”/><外键foreignTable=“ask_user”><参考当地的=“user_id”外国=“id”/>< /外键><列的名字=“分数”类型=“整数”/><列的名字=“created_at”类型=“时间戳”/>< /表>< /数据库>
注意,数据库名称设置为推动
在这个文件中,不管实际的数据库名称是什么。这是一个用于将Propel层连接到symfony框架的参数。ob娱乐下载数据库的实际名称将在databases.yml
配置文件(见下文)。
还有另一种方法来创建schema.xml
如果您有一个现有的数据库。也就是说,如果您熟悉图形化数据库设计工具,那么您将倾向于从生成的MySQL数据库构建模式。在此之前,您只需要编辑propel.ini
文件位于使用/ config /
目录,并输入到数据库的连接设置:
Propel.database.url = mysql://username:password@localhost/databasename
…用户名
,密码
,本地主机
而且数据库名
是数据库的实际连接设置。您现在可以调用propel-build-schema
命令(从使用/
目录)来生成schema.xml
从数据库中:
$ ob娱乐下载symfony推进-构建-schema
请注意
有些工具允许您以图形化的方式构建数据库(例如Fabforce的Dbdesigner),并直接生成aschema.xml
(与数据库设计器4推进模式转换器).
而不是创建一个schema.xml
文件,也可以创建schema.yml
使用YAML模式格式的文件:
propel: _attributes: {noXsd: false, defaultIdMethod: none, package: lib。model} ask_question: _attributes: {phpName: Question, idMethod: native} id: {type: integer, required: true, primaryKey: true, autoIncrement: true} user_id: {type: integer, foreignTable: ask_user, foreignReference: id} title: {type: longvarchar} body: {type: longvarchar} created_at: ~ updated_at: ~ ask_answer: _attributes: {phpName: Answer, idMethod: native} id: {type: integer, required: true, primaryKey: true, autoIncrement: true} question_id: {type: integer, foreignTable:ask_question, foreignReference: id} user_id: {type: integer, foreignTable: ask_user, foreignReference: id} body: {type: longvarchar} created_at: ~ ask_user: _attributes: {phpName: User, idMethod: native} id: {type: integer, required: true, primaryKey: true, autoIncrement: true} nickname: {type: varchar(50), required: true, index: true} first_name: varchar(100) last_name: varchar(100) created_at: ~ ask_interest: _attributes: {phpName: Interest, idMethod: native} question_id: {type: longvarchar}integer, foreignTable: ask_question, foreignReference: id, primaryKey: true} user_id: {type: integer, foreignTable: ask_user, foreignReference: id, primaryKey: true} created_at: ~ ask_relevance: _attributes: {phpName: relevance, idMethod: native} answer_id: {type: integer, foreignTable: ask_answer, foreignReference: id, primaryKey: true} user_id: {type: integer, foreignTable: ask_user, foreignReference: id, primaryKey: true} score: {type: integer} created_at: ~
对象模型构建
要使用InnoDB引擎,必须在propel.ini
文件使用/ config /
目录:
push .mysql. tabletype = InnoDB
一旦schema.xml
时,您可以基于关系模型生成对象模型。在syob娱乐下载mfony中,对象关系映射由Propel处理,但封装在symfony命令中:
$ ob娱乐下载symfony推进-构建-模型
这个命令(您需要从askeet项目的根目录调用它)将生成与模式中定义的表相对应的类,以及标准访问器(- > get ()
而且- >设置()
方法)。方法中查看生成的代码使用/ lib /模型/ om /
目录中。如果您想知道为什么每个表有两个类,请查看模型一章交响乐书的。ob娱乐下载这些类将在每次执行建造模式
,这在这个项目中会经常发生。因此,如果需要向模型对象添加方法,则必须修改位于使用/ lib /模型/
目录——这些类继承自/ om
的人。
数据库
连接
现在symfonyob娱乐下载已经有了数据库的对象模型,是时候将项目连接到MySQL数据库了。首先,你必须在MySQL中创建一个数据库:
$ mysqladmin -u youruser -p create askeet
现在打开使用/ config / databases.yml
配置文件。如果这是您第一次使用symfony,您会发现symfony配置文ob娱乐下载件是用YAML.语法非常简单,但在YAML文件中有一个主要的义务:永远不要使用表格,总是使用空格。项下的数据库实际连接设置之后,就可以编辑文件了全部:
类别:
all: propel: class: sfPropelDatabase param: phptype: mysql host: localhost database: askeet username: youruser password: yourpasswd
如果您想了解更多关于symfony配置和YAML文件的信息,请ob娱乐下载阅读实践配置章交响乐书的。ob娱乐下载
构建
如果你没有写schema.xml
手动文件,您的数据库中可能已经有相应的表。然后你可以跳过这部分。
对于键盘爱好者来说,这里有一个惊喜:您不需要在MySQL数据库中创建表和列。你做过一次schema.xml
,因此syob娱乐下载mfony将构建SQL语句为您创建所有这些:
$ ob娱乐下载symfony push -build-sql
该命令创建一个lib.model.schema.sql
在使用/数据/ sql /
目录中。在MySQL中使用它作为SQL命令:
$ mysql -u youruser -p askeet < data/sql/lib.model.schema.sql
或者,也可以使用propel-insert-sql
任务:
$ ob娱乐下载symfony push -insert-sql
通过CRUD测试数据访问
看到所做的工作是有用的总是好的。到目前为止,你的浏览器没有任何用处,但我们应该构建一个web应用程序……因此,让我们创建一组基本的symfony模板和操作来操作“问题ob娱乐下载”表的数据。这将允许您创建一些问题并显示它们。
在使用/
目录类型:
$ ob娱乐下载symfony push -generate-crud frontend question问题
的脚手架问题
模块中的前端
应用,基于问题
驱动对象模型,具有基本的创建、检索、更新、删除操作(这解释了CRUD首字母缩写)。不要感到困惑:脚手架并不是一个完成的应用程序,而是基本结构,您可以在其之上开发新功能、添加业务规则和自定义外观。
CRUD生成器创建的所有操作的列表如下:
动作名称 | 描述 |
---|---|
列表 | 显示表的所有记录 |
指数 | 转发至列表 |
显示 | 显示给定记录的所有字段 |
编辑 | 显示窗体以创建新记录或编辑现有记录 |
更新 | 根据请求中给出的参数修改一条记录,然后转发显示 |
删除 | 从表中删除给定的记录 |
中可以找到有关生成操作的更多信息脚手架章交响乐书的。ob娱乐下载
在使用/应用程序/前端/模块/
目录,注意新建问题
模块并浏览其源代码。
当你添加一个需要自动加载的新类时,不要忘记清空配置缓存(以重新加载自动加载缓存):
$ ob娱乐下载symfony cc frontend config
您现在可以通过以下请求在线测试:
http://askeet/question
来吧,玩吧。增加一些问题,编辑它们,列出它们,删除它们。如果它工作,这意味着对象模型是正确的,到数据库的连接是正确的,数据库的关系模型和symfony的对象模型之间的映射是正确的。ob娱乐下载这是一个很好的功能测试。
明天见
您没有编写任何PHP代码,但是您已经拥有了一个基本的应用程序。这对第二天来说还不错。明天,我们将开始编写一些代码,以便有一个显示问题列表的欢迎主页。我们还将使用批处理过程将测试数据添加到数据库中,并学习如何扩展模型。
现在您知道了应用程序将做什么,您可以想象它的一个附加特性。请随意使用使用邮件列表,最受欢迎的想法将成为这个symfony降临日历的第21天。ob娱乐下载
请随意浏览今天教程的源代码(标签release_day_2
):
http://svn.askeet.com/tags/release_day_2
本作品采用创作共用署名-非商业性-禁止派生作品3.0未移植许可协议授权。