第三天:数据模型
你渴望打开文本编辑器和放下一些PHP将很高兴知道今天会给我们带来一些发展。我们将定义Jobeet数据模型,使用一个ORM来与数据库交互,构建应用程序的第一个模块。但随着symfob娱乐下载ony为我们做了很多的工作,我们将有一个功能齐全的web模块没有写太多的PHP代码。
关系模型
我们昨天看到的用户故事描述我们的项目的主要对象:工作,分公司和类别。这是对应的实体关系图:
除了列中所描述的故事,我们还增加了一个created_at
字段表。ob娱乐下载Symfony识别等领域,将值设置为当前系统时间创建一个记录。这是相同的updated_at
领域:他们的值设置为系统时间只要记录被更新。
的模式
存储工作,分公司,和类别,我们显然需要一个关系数据库。
但随着symfob娱乐下载ony是一种面向对象的框架,我们喜欢每当我们可以操作对象。例如,而不是编写SQL语句从数据库检索记录,我们宁愿更喜欢使用对象。
关系数据库信息必须映射到对象模型。这可以用一个ORM工具谢天谢地,symfony和两人捆ob娱乐下载绑在一起:推动和学说。在本教程中,我们将使用推动。
ORM表及其关系的描述需要创建相关的类。有两种方法可以创建这个描述模式:通过内省现有数据库或通过创建它。
请注意
一些工具允许您构建一个图形(例如数据库Fabforce的Dbdesigner),直接生成schema.xml
(与数据库设计师4推动模式转换器)。
数据库不存在,我们希望保持Jobeet数据库不可知论者,让我们创建的模式文件手工编辑是空的配置/ schema.yml
文件:
#配置/模式。yml推动:jobeet_category: id: ~名字:{类型:varchar(255),要求:真的,指数:独特}jobeet_job: id: ~ category_id添加:{类型:整数,foreignTable: jobeet_category foreignReference: id、要求:真实}类型:{类型:varchar(255)}公司:{类型:varchar(255),要求:真实}标识:{类型:varchar (255)} url:{类型:varchar(255)}位置:{类型:varchar(255),要求:真实}位置:{类型:varchar(255),要求:真实}描述:{类型:用longvarchar,要求:真}how_to_apply:{类型:用longvarchar,要求:真}牌:{类型:varchar(255),要求:真的,指数:独特}is_public:{类型:布尔,要求:真的,默认值:1}is_activated:{类型:布尔,要求:真的,默认值:0}电子邮件:{类型:varchar(255),要求:真实}expires_at:{类型:时间戳,要求:真}created_at: ~ updated_at: ~ jobeet_affiliate: id: ~ url:{类型:varchar(255),要求:真实}电子邮件:{类型:varchar(255),要求:真的,指数:独特}牌:{类型:varchar(255),要求:真实}is_active:{类型:布尔,要求:真的,默认值:0}created_at: ~ jobeet_category_affiliate: category_id添加:{类型:整数,foreignTable: jobeet_category foreignReference: id、要求:真的,primaryKey:真的,onDelete:级联}affiliate_id:{类型:整数,foreignTable: jobeet_affiliate foreignReference: id、要求:真的,primaryKey:真的,onDelete:级联}
提示
如果你决定创建表通过编写SQL语句,您可以生成相应的schema.yml
配置文件通过运行推动:建立模式
任务:
php syob娱乐下载mfony推动美元:建立模式
上面的任务要求你有一个配置数据库databases.yml
。我们向您展示如何配置数据库在下一步。如果您尝试运行这个任务现在是行不通的,因为它不知道数据库构建的模式。
模式的直接翻译YAML格式的实体关系图。
的schema.yml
文件包含所有的表和列的描述。每一列描述以下信息:
类型
:列类型(布尔
,非常小的整数
,短整型
,整数
,长整型数字
,双
,浮动
,真正的
,小数
,字符
,varchar(大小)
,用longvarchar
,日期
,时间
,时间戳
,团
,clob
)要求
:设置为真正的
如果你想需要的列指数
:设置为真正的
如果你想创建一个索引的列或独特的
如果你想要创建唯一索引的列。primaryKey
:定义一个表的主键列。foreignTable
,foreignReference
:定义一个对另一个表的外键列。
为列设置为~
,这意味着零
在YAML (id
,created_at
,updated_at
),sob娱乐下载ymfony会猜的最佳配置(主键id
和时间戳created_at
和updated_at
)。
请注意
的onDelete
属性定义了在删除
外键的行为,推动支持级联
,SETNULL
,限制
。例如,当一个工作
记录被删除,所有的jobeet_category_affiliate
相关的记录将被自动删除数据库或通过推动如果底层引擎不支持此功能。
数据库
symfob娱乐下载ony框架支持所有PDO-supported数据库(MySQL、PostgreSQL、SQLite、甲骨文、该软件,…)。PDO是数据库抽象层|数据库抽象层与PHP绑定。
让我们使用MySQL本教程:
美元mysqladmin -uroot - p创建jobeet输入密码:mYsEcret # #密码将回声为* * * * * * * *
请注意
感觉自由选择如果你想要另一个数据库引擎。不会很难适应我们将编写的代码,我们将使用ORM将编写SQL。
我们需要告诉symfony Joob娱乐下载beet项目使用这个数据库:
美元php ob娱乐下载symfony的配置:数据库mysql:主机= localhost; dbname = jobeet”根mYsEcret
的配置:数据库
任务有三个参数:PDO DSN、用户名和密码来访问数据库。如果你不需要密码访问数据库开发服务器,只是省略第三个参数。
请注意
的配置:数据库
任务存储数据库配置的配置/ databases.yml
配置文件。而不是使用任务时,您可以手工编辑这个文件。
谨慎
通过在命令行上方便但数据库密码不安全的。取决于谁有权访问您的环境,它可能是更好的编辑配置/ databases.yml
更改密码。当然,保证密码的安全,配置文件访问模式也应受到限制。
ORM
由于数据库的描述schema.yml
文件,我们可以使用一些推动内置的任务来生成所需的SQL语句创建数据库表:
php syob娱乐下载mfony推动美元:构建——sql
的推动:构建——sql
任务生成的SQL语句数据/ sql /
目录,为数据库引擎优化配置:
从数据/ sql / lib.model.schema.sql #片段创建表“jobeet_category”(“id”整数不零AUTO_INCREMENT,“名字”VARCHAR(255年)不零,主关键(“id”),独特的关键“jobeet_category_U_1”(“名字”))类型= InnoDB;
在数据库中创建表,您需要运行推动:插入sql
任务:
php syob娱乐下载mfony推动美元:插入sql
提示
对于任何一个命令行工具,symfony的任务可以带参数和选项ob娱乐下载。每个任务都有一个内置的帮助信息,可以通过运行显示帮助
任务:
php syob娱乐下载mfony帮助推动美元:插入sql
帮助信息列出所有可能的参数和选项,给他们每个人的默认值,并提供一些有用的用法示例。
ORM还生成PHP类表记录映射到对象:
php syob娱乐下载mfony推动美元:构建——模型
的推动:构建——模型
任务生成PHP文件lib /模型/
目录,可以用来与数据库交互。
通过浏览生成的文件,您可能已经注意到,推动每个表生成四类。为jobeet_job
表:
JobeetJob
:这个类的一个对象代表单个记录的jobeet_job
表。类的默认是空的。BaseJobeetJob
的父类JobeetJob
。每次运行推动:构建——模型
这类覆盖,所以所有定制必须做的JobeetJob
类。JobeetJobPeer
:主要的类定义静态方法返回集合的JobeetJob
对象。类的默认是空的。BaseJobeetJobPeer
的父类JobeetJobPeer
。每次运行推动:构建——模型
这类覆盖,所以所有定制必须做的JobeetJobPeer
类。
列值的记录可以操纵一个模型对象通过使用访问器(* ()
方法)和调整器(设置* ()
方法):
美元的工作=新JobeetJob();美元的工作- >setPosition(Web开发人员的);美元的工作- >保存();回声美元的工作- >getPosition();美元的工作- >删除();
您还可以定义外键直接通过连接对象在一起:
美元的类别=新JobeetCategory();美元的类别- >setName(“编程”);美元的工作=新JobeetJob();美元的工作- >setCategory(美元的类别);
的推动:构建——所有
任务是一个快捷方式的任务运行在这一节和更多。现在运行这个任务生成表单和Jobeet模型的验证器类:
php syob娱乐下载mfony推动美元:构建——都无法得到确认
今天你会看到验证器,形式将解释在伟大的细节在10天。
最初的数据
在数据库中创建了表但没有数据。对于任何web应用程序中,有三种类型的数据:
初始数据:初始数据所需的应用程序来工作。例如,Jobeet需要一些初始类别。如果不是,没有人可以提交作业。我们还需要一个管理员用户能够登录到后台。
测试数据:测试数据需要被测试应用程序。作为一名开发人员,您将编写测试来确保Jobeet行为描述的用户故事,最好的方法是编写自动化测试。所以,每次您运行测试时,您需要一个干净的数据库和一些新鲜的数据来测试。
用户数据:用户数据是由用户在应用程序的正常生活。
每次symfony创ob娱乐下载建数据库中的表,所有的数据都会丢失。与一些初始数据填充数据库,我们可以创建一个PHP脚本,或者执行一些SQL语句mysql
程序。但随着需要的是十分常见,用symfony有一个更好的办法:在创建YAML文件ob娱乐下载数据/夹具/
目录和使用推动:数据加载
任务加载到数据库中。
首先,创建以下夹具文件:
#数据/夹具/ 010 _categories。yml JobeetCategory:设计:{名称:设计}编程:{名称:编程}经理:{名称:经理}管理员:{名称:管理员}/夹具/ 020 _jobs #数据。yml JobeetJob: job_sensio_labs: category_id添加:编程类型:全职公司:Sensio赞助实验室标志:sensio-labs。gif url: http://www.sensiolabs.com/位置:Web开发人员地点:巴黎,法国描述:|你已经开发网站的symfony和你想使用开源技术。ob娱乐下载你有至少3年以上网站开发经验与PHP或Java和你希望参与开发web 2.0站点使用最好的框架可用。法比安how_to_apply: |发送简历。效力[在]sensio.com is_public:真is_activated:真正的令牌:job_sensio_labs电子邮件:job@example.com expires_at: 2010-10-10 job_extreme_sensio: category_id添加:设计类型:兼职公司:极端Sensio赞助标识:extreme-sensio。gif url: http://www.extreme-sensio.com/位置:网页设计师地点:巴黎,法国描述:| Lorem ipsum悲哀坐amet, consectetur adipisicing elit, sed做eiusmod时间incididunt ut并dolore麦格纳aliqua。Ut enim广告微量veniam, nostrud实习ullamco laboris非绝对的Ut aliquip前任ea commodo consequat。酒后驾车aute irure reprehenderit的悲哀。Voluptate velit存在cillum dolore欧盟fugiat木棒pariatur。Excepteur它们occaecat cupidatat非proident,是我的疏忽,系deserunt mollit est laborum似的id。 how_to_apply: | Send your resume to fabien.potencier [at] sensio.com is_public: true is_activated: true token: job_extreme_sensio email: job@example.com expires_at: 2010-10-10
请注意
工作夹具文件引用两个图像。你可以下载(/ / jobeet / sensio-labs.gif
,/ / jobeet / extreme-sensio.gif
),并把它们放在web /上传/工作/
目录中。
设备文件写在YAML、定义模型对象,标签与一个唯一的名称(例如,我们定义了两个标签的工作job_sensio_labs
和job_extreme_sensio
)。这个标签的使用链接相关的对象,而不必定义主键(这通常是自动递增,不能集)。例如,job_sensio_labs
工作类别编程
,标签的“编程”类别。
提示
YAML文件中,当一个字符串包含换行符(如描述
列工作夹具文件),您可以使用管道(|
)来表示字符串将跨越几行。
虽然固定文件可以包含对象从一个或几个模型,我们决定创建一个文件每个模型Jobeet fixture。
提示
注意文件名前缀的数字。这是一个简单的方法来控制数据加载的顺序。在之后的项目,如果我们需要插入一些新的夹具文件,这将是容易,因为我们有一些免费的数字之间现有的。
在固定文件中,您不需要定义所有列值。如果不是,symob娱乐下载fony将使用数据库模式中定义的默认值。在symfonob娱乐下载y使用驱动加载数据到数据库中,所有的内置的行为(如自动设置created_at
或updated_at
列)和自定义行为你可能会添加到模型类被激活。
初始数据装载到数据库运行一样简单推动:数据加载
任务:
php syob娱乐下载mfony推动美元:数据加载
提示
的推动:构建————和负载
任务是一个捷径推动:构建——所有
任务之后,推动:数据加载
的任务。
在行动在浏览器中看到它
我们使用命令行接口很多但这不是很令人激动,尤其是对一个web项目。我们现在拥有每一样东西,我们需要创建网页与数据库交互。
让我们看看如何显示工作列表,如何编辑现有的工作,以及如何删除一个工作。解释在第一天,一个symfony项目是由应用程序。ob娱乐下载进一步划分为每个应用程序模块。一个模块是一个自包含的PHP代码表示一个应用程序的功能(例如API模块),或一组操作,用户可以在一个模型对象(例如一个工作模块)。
ob娱乐下载Symfony能够自动生成模块对于一个给定的模型,提供了基本的操作特点:
php syob娱乐下载mfony推动美元:generate-module——show non-verbose-templates JobeetJob前端的工作
的推动:generate-module
生成一个工作
模块的前端
申请JobeetJob
模型。如同大多数symfony的ob娱乐下载任务,创建了一些文件和目录下应用程序/前端/模块/工作/
目录:
目录 | 描述 |
---|---|
行为/ |
模块操作 |
模板/ |
模块的模板 |
的行动/ actions.class.php
文件定义了所有可用的行动为工作
模块:
动作名称 | 描述 |
---|---|
指数 |
显示表的记录 |
显示 |
显示的字段及其值对于一个给定的记录 |
新 |
显示一个表单来创建一个新记录 |
创建 |
创建一个新的记录 |
编辑 |
显示一个表单来编辑现有记录 |
更新 |
根据用户提交的值更新记录 |
删除 |
从表中删除给定的记录 |
现在,您可以在浏览器中测试工作模块:
http://www.jobeet.com.localhost/frontend_dev.php/job
如果你想编辑一份工作,你将有一个例外,因为symfony需要一个类别的文本表示。ob娱乐下载一个PHP对象表示与PHP可以定义__toString ()
神奇的方法。一个类别的文本表示中定义应该记录JobeetCategory
模型类:
/ / lib /模型/ JobeetCategory.php类JobeetCategory扩展BaseJobeetCategory{公共函数__toString(){返回这个美元- >getName();}}
现在每次symfony需要一ob娱乐下载个文本表示的类别,它调用__toString ()
方法返回类别名称。我们需要一个文本表示的模型类或另一个,让我们定义一个__toString ()
方法对每一个模型类:
/ / lib /模型/ JobeetJob.php类JobeetJob扩展BaseJobeetJob{公共函数__toString(){返回sprintf(“% s % s (% s) ',这个美元- >getPosition(),这个美元- >getCompany(),这个美元- >getLocation());}}/ / lib /模型/ JobeetAffiliate.php类JobeetAffiliate扩展BaseJobeetAffiliate{公共函数__toString(){返回这个美元- >getUrl();}}
您现在可以创建和编辑工作。试图将一个必需的字段置空,或输入一个无效的日期。没错,symfony提供了基ob娱乐下载本的验证规则通过内省数据库模式。
最终的想法
这是所有。我已经警告你的介绍。今天,我们几乎没有编写PHP代码,但我们有一个web模块的工作模式,可以调整和定制。记住,没有PHP代码也意味着没有错误!
如果你还有精力,随时阅读模块生成的代码和模型并试图理解它是如何工作的。如果不是,别担心,睡好,明天我们将讨论web框架,最常用的范例之一MVC设计模式。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。