组织您的业务逻辑

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

组织您的业务逻辑

在计算机软件中,业务逻辑或域逻辑是“程序编码的一部分真实的业务规则,确定如何创建数据,显示,存储,和改变”(阅读完整的定义)。

在Sy欧宝娱乐app下载地址mfony应用程序中,业务逻辑的所有自定义代码编写应用程序,不是特定于框架(如路由和控制器)。域类,教义实体和常规PHP类作为服务是业务逻辑的好例子。

对于大多数项目,你应该存储在AppBundle的一切。在这里,您可以创建任何你想要的目录组织方面:

1 2 3 4 5 6 7 8
欧宝娱乐app下载地址symfony2-project /├─app /├─src /│└─AppBundle /│└─跑龙套/│└─MyClass。php├─供应商/└─web /

存储类以外的包吗?

但是没有技术将业务逻辑在包的原因。如果你喜欢,你可以创建自己的名称空间内src /目录,把事情:

1 2 3 4 5 6 7 8 9
欧宝娱乐app下载地址symfony2-project /├─app /├─src /│├─Acme /││└─跑龙套/││└─MyClass。php│└─AppBundle /├─供应商/└─web /

提示

推荐使用的方法AppBundle /目录是为了简单起见。如果你足够先进的知道需要生活在一个包可以生活之外的一个,然后随意这样做。

服务:命名和格式

博客应用程序需要一个实用程序,可以将文章标题(如。“Hello World”)到一个鼻涕虫(如。“hello world”)。“鼻涕虫”将作为URL的一部分。

让我们创建一个新的重击者内部类src / AppBundle /跑龙套,并添加以下slugify ()方法:

1 2 3 4 5 6 7 8 9 10 11 12
/ / src / AppBundle / Slugger.php跑龙套名称空间AppBundle\跑龙套;重击者{公共函数slugify(美元字符串){返回preg_replace (' / [^ a-z0-9] / ',“- - -”、函数(修剪(strip_tags (美元字符串))));}}

接下来,为该类定义一个新的服务。

1 2 3 4 5
# app / config / services.yml服务:#保持你的服务名称app.slugger:类:AppBundle \跑龙套\棒球强击手

传统上,涉及的命名约定的服务类名称和位置后,以避免名称冲突。因此,服务会被被称为app.utils.slugger。但通过使用短的服务名称,代码更容易阅读和使用。

最佳实践

应用程序的服务的名称应尽可能短,但独特的足够,你可以搜索你的项目服务如果您需要。

现在你可以使用自定义重击者在任何控制器类,如AdminController:

1 2 3 4 5 6 7 8 9 10 11
公共函数createAction(请求美元请求){/ /……如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {美元鼻涕虫=美元- >get (“app.slugger”)- >slugify (美元帖子- >getTitle ());美元帖子- >setSlug (美元鼻涕虫);/ /……}}

服务形式:YAML

在前面的小节中,YAML被用来定义服务。

最佳实践

使用YAML格式定义您自己的服务。

这是有争议的,在我们的经验中,使用YAML和XML是均匀地分布在开发人员中,有轻微的偏好向YAML。两种格式都有相同的性能,最终这是个人口味的问题。

我们建议YAML因为它是友好的新人和简洁。您当然可以使用您喜欢的任何格式。

服务:没有类参数

您可能已经注意到,之前的服务定义不配置类名称空间作为一个参数:

1 2 3 4 5 6 7 8 9
# app / config / services.yml#服务定义和类名称作为参数参数:slugger.class:AppBundle \跑龙套\棒球强击手服务:app.slugger:类:“% slugger.class %”

这种做法很麻烦,完全没有必要为自己的服务:

最佳实践

不定义参数类的服务。

这种做法是错误地采用从第三方包。Symfo欧宝娱乐app下载地址ny推出了服务容器时,一些使用这项技术的开发人员很容易地允许覆盖服务。然而,覆盖服务通过改变其类名是一个非常罕见的用例,因为通常情况下,这项新服务有不同的构造函数参数。

使用一个持久层

欧宝娱乐app下载地址Symfony是HTTP框架,它只关心生成每个HTTP请求的HTTP响应。这就是为什么Symfo欧宝娱乐app下载地址ny提供了一种不跟一个持久层(如数据库、外部API)。你可以选择任何你想要的库或策略。

在实践中,许多Symfony应用程序欧宝娱乐app下载地址依赖于独立主义项目使用实体和存储库定义他们的模型。就像业务逻辑,我们建议存储原则AppBundle中的实体。

样本的博客应用程序定义的三个实体是一个很好的例子:

1 2 3 4 5 6 7 8
欧宝娱乐app下载地址symfony2-project /├─……└─src /└─AppBundle /└─实体/├─发表评论。php├─职位。php└─User.php

提示

如果你是更高级的,你当然可以将它们存储在自己的名称空间src /

教义映射信息

教义实体是纯PHP对象存储在一些“数据库”。教义只有知道您的实体通过映射元数据配置为您的模型类。理论支持四元数据格式:YAML、XML、PHP和注释。

最佳实践

使用注解来定义的映射信息主义的实体。

注释是目前最方便的和敏捷的方式建立和寻找映射信息:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
名称空间AppBundle\实体;使用学说\ORM\映射作为ORM;使用学说\常见的\集合\ArrayCollection;/ * * *@ORM实体\ * /帖子{常量NUM_ITEMS =10;/ * * *@ORM\ Id *@ORM\ GeneratedValue *@ORM\列(类型=“整数”)* /私人美元id;/ * * *@ORM\列(type = "字符串")* /私人美元标题;/ * * *@ORM\列(type = "字符串")* /私人美元鼻涕虫;/ * * *@ORM\列(type = " text ") * /私人美元内容;/ * * *@ORM\列(type = "字符串")* /私人美元authorEmail;/ * * *@ORM\列(type = " datetime) * /私人美元publishedAt;/ * * *@ORM\ OneToMany (* targetEntity = "评论",*的mappedBy =“post”, * orphanRemoval = true *) *@ORM\ OrderBy ({“publishedAt”=“ASC”}) * /私人美元评论;公共函数__construct(){美元- >publishedAt =\ DateTime ();美元- >评论=ArrayCollection ();}/ / getter和setter……}

所有格式都有相同的性能,这是又一次最终的味道。

数据设备

设备支持在默认情况下不启用在Symfony中,你应该执行以下命令安装原则装置包:欧宝娱乐app下载地址

1
作曲家需要美元“教义/ doctrine-fixtures-bundle”

然后,使包AppKernel.php,但只有dev测试环境:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
使用欧宝娱乐app下载地址\组件\HttpKernel\内核;AppKernel扩展内核{公共函数registerBundles(){美元=数组(/ /……);如果(in_array (美元- >getEnvironment (),数组(“开发”,“测试”))){/ /……美元[]=学说\包\ FixturesBundle \ DoctrineFixturesBundle ();}返回美元;}/ /……}

我们建议创建一个设备类为简单起见,不过欢迎你有更多如果该类相当大。

假如你至少有一个fixture类和数据库访问配置正确,你可以加载装置通过执行下面的命令:

1 2 3 4 5
$ php应用程序/控制台学说:夹具:负载小心,数据库将被净化。你想继续Y / N ?Y >清除数据库>加载AppBundle \ DataFixtures \ ORM \ LoadFixtures

编码标准

Symf欧宝娱乐app下载地址ony的源代码遵循PSR-1PSR-2编码标准所定义的PHP社区。欧宝下载链接你可以了解更多Symf欧宝娱乐app下载地址ony的编码标准甚至使用PHP-CS-Fixer,这是一个命令行实用程序,可以解决整个代码库的编码标准在几秒钟。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。