组织您的业务逻辑

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

组织您的业务逻辑

在计算机软件中,业务逻辑或者领域逻辑是“对决定如何创建、显示、存储和更改数据的实际业务规则进行编码的程序的一部分”完整的定义).

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

对于大多数项目,您应该将所有内容存储在AppBundle中。在这里,你可以创建任何你想要组织的目录:

1 2 3 4 5 6 7 8
ob娱乐下载symfony2-project/├─app/├─src/│├─AppBundle/│├─Utils/│├─MyClass.php├─vendor/├─web/

将类存储在Bundle之外?

但是在技术上没有理由将业务逻辑放在捆绑包中。的名称空间中创建自己的名称空间src /目录并把东西放在那里:

1 2 3 4 5 6 7 8 9
ob娱乐下载symfony2-project/├─app/├─src/│├─Acme/││├─Utils/││├─MyClass.php│├─AppBundle/├─vendor/├─web/

提示

的推荐使用方法AppBundle /目录是为了简单。如果您足够高级,知道什么需要存在于捆绑包中,什么可以存在于捆绑包之外,那么您可以自由地这样做。

服务:命名和格式

博客应用程序需要一个可以转换文章标题的实用程序(例如。“Hello World”)变成一个段语(例如:“hello world”)。这个片段将被用作post URL的一部分。

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

12 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 %”

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

最佳实践

不要为服务的类定义参数。

第三方捆绑包错误地采用了这种做法。当Symfob娱乐下载ony引入它的服务容器时,一些开发人员使用这种技术轻松地允许覆盖服务。然而,仅通过更改类名来覆盖服务是一种非常罕见的用例,因为新服务通常具有不同的构造函数参数。

使用持久层

ob娱乐下载Symfony是一个HTTP框架,它只关心为每个HTTP请求生成HTTP响应。这就是为什么Symfoob娱乐下载ny不提供与持久层(例如数据库、外部API)通信的方法。你可以选择任何你想要的库或策略。

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

我们的示例博客应用程序定义的三个实体就是一个很好的例子:

1 2 3 4 5 6 7 8
ob娱乐下载Symfony2-project /├─…├─src/├─AppBundle/├─Entity/ Comment.php├─Post.php

提示

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

原理映射信息

实体是存储在某个“数据库”中的普通PHP对象。Doctrine仅通过为模型类配置的映射元数据了解您的实体。Doctrine支持四种元数据格式:YAML、XML、PHP和注释。

最佳实践

使用注释来定义Doctrine实体的映射信息。

注解是目前为止最方便、最敏捷的设置和查找映射信息的方法:

12 34 56 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="Comment", * mappedBy="post", * orphanRemoval=true *) *@ORM\OrderBy({" publhedat " = "ASC"}) */私人评论公共函数__construct()->publishedAt =\ DateTime ();->评论=ArrayCollection ();}// getter和setter…

所有格式都有相同的性能,所以这最终又是一个品味问题。

数据设备

由于Symfony默认情况下不启用fixture支持,您应该执行以下命令来安装Doctrine fob娱乐下载ixture包:

1
$ composer require“教义/ doctrine-fixtures-bundle”

然后,启用bundle inAppKernel.php,但只是为了dev而且测验环境:

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

我们建议创建一个设备类为了简单起见,如果类变得相当大,欢迎您添加更多。

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

1 2 3 4 5
小心,数据库将被清除。你想要继续Y / N ?Y >清洗数据库>加载AppBundle\DataFixtures\ORM\LoadFixtures

编码标准

Symfob娱乐下载ony源代码遵循PSR-1而且PSR-2由PHP社区定义的编码标准。欧宝体育平台怎么样你可以了解更多Symfob娱乐下载ony编码标准甚至使用PHP-CS-Fixer,这是一个命令行实用程序,可以在几秒钟内修复整个代码库的编码标准。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。