组织您的业务逻辑
编辑本页警告:您正在浏览的文档欧宝官网下载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,这是一个命令行实用程序,可以在几秒钟内修复整个代码库的编码标准。