Symfob娱乐下载ony框架最佳实践

5.3版本
ob娱乐下载Symfony 5.3支持通过乔利科

Symfob娱乐下载ony框架最佳实践

本文描述了使用Symfony开发web应用程序的最佳实践ob娱乐下载这符合原始Symfony创作者所设想的哲学。ob娱乐下载

如果您不同意其中一些建议,他们可能是一个好的初始点那你就可以扩展并适合您的具体需求.您甚至可以完全忽略它们并继续使用您自己的最佳实践和方法。ob娱乐下载Symfony足够灵活,以适应您的需求。

本文假设您已经具有开发Symfony应用程序的经验。ob娱乐下载如果你不知道,先读开始文件的一部分。欧宝官网下载app

提示

ob娱乐下载Symfony提供了一个调用示例应用程序ob娱乐下载Symfony演示它遵循所有这些最佳实践,所以您可以在实践中体验它们。

创建项目

使用symfonob娱乐下载y二进制文件来创建Symfony应用程序

Symfob娱乐下载ony二进制文件是在您的机器上创建的可执行命令obb体育 .它提供了多种实用工具,包括创建新Symfony应用程序的最简单方法:ob娱乐下载

1
ob娱乐下载symfony新我的项目名称

在幕后,这个Symfony二进制命令执行所ob娱乐下载需的操作作曲家命令创建一个新的Symfonyob娱乐下载应用程序基于当前稳定版本。

使用默认目录结构

除非您的项目遵循强加于特定目录结构的开发实践,否则请遵循默认的Symfony目录结构。ob娱乐下载它是扁平的,不言自明的,没有与Symfony耦合:ob娱乐下载

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
your_project /├─资产/├─bin/│└ - 控制台├─配置/│├─包/│└─服务.Yaml├─迁移/├─公共/│├─build /│└─igent.php├─SRC /│├─kernel.php│├──控制器/│├─datafixtures /│├─实体/│├─evacesubscriber /│├─格式/│├─存储库/│├─安全/│└──枝/├─模板/├─测试/├─翻译/├─var /│├─cache/│└─log /└─供应商/

配置

使用环境变量进行基础设施配置

这些选项的值在不同的机器之间会发生变化(例如,从开发机器到生产服务器),但它们不会修改应用程序的行为。

在项目中使用env变量要定义这些选项并创建多个选项.env文件配置每个环境的env变量

对敏感信息使用机密

当你的应用程序有敏感配置时——比如API密钥——你应该通过ob娱乐下载Symfony的秘密管理系统

使用应用程序配置参数

这些选项用于修改应用程序行为,如电子邮件通知的发送者或启用的功能切换.它们的值不会因每台机器而改变,所以不要将它们定义为环境变量。

定义这些选项参数配置/ services.yaml文件。您可以重写这些选项环境config/services\u dev.yaml配置/ services_prod.yaml文件。

使用短且带前缀的参数名称

考虑使用应用程序。作为你的前缀参数避免与symfony和第三方捆绑/库参数碰撞。ob娱乐下载然后,只使用一个或两个单词来描述参数的目的:

1 2 3 4 5 6 7 8 9 10
#config/services.yaml参数#不要这样做:“dir”太笼统了,没有任何意义app.dir'...'#这样做:简短但容易理解的名字app.contents\u dir'...'#可以使用点、下划线、破折号或什么都不用,但要始终如此#保持一致,并对所有参数使用相同的格式app.dir.contents'...'app.contents-dir'...'

使用常量来定义很少更改的选项

配置选项(比如在某些清单中显示的项目数量)很少改变。而不是定义为配置参数,将它们定义为相关类中的PHP常量。例子:

/ / src /实体/ Post.php名称空间应用程序\实体帖子平民的constNUMBER_OF_ITEMS10.// ......

常量的主要优点是你可以在任何地方使用它们,包括Twig模板和Doctrine实体,而参数只能从访问服务容器

对这种配置值使用常量的唯一显著缺点是在测试中重新定义它们的值很复杂。

业务逻辑

不要创建任何包来组织应用程序逻辑

当Symfob娱乐下载ony 2.0发布时,使用了应用程序捆绑将代码划分为逻辑特性:UserBundle、ProductBundle、InvoiceBundle等。然而,捆绑包意味着可以作为一个独立的软件片段进行重用。

如果您需要在项目中重用某些功能,请为其创建一个捆绑包(在私有存储库中,以使其不公开)。对于应用程序代码的其余部分,使用PHP名称空间来组织代码,而不是捆绑包。

使用Autowiring自动执行应用程序服务的配置

服务自动装配是一个特性,它读取构造函数(或其他方法)上的类型提示,并自动将正确的服务传递给每个方法,从而无需显式配置服务,并简化了应用程序维护。

与它结合使用服务自动配置还添加服务标签给需要它们的服务,如Twig扩展、事件订阅者等。

只要有可能,服务应该是私有的

使服务私人阻止您通过$container->get().相反,您需要使用适当的依赖注入。

使用yaml格式来配置您自己的服务

如果你使用默认的服务。yaml的配置,大多数服务将自动配置。然而,在某些边缘情况下,您需要手动配置服务(或其中的一部分)。

yaml是建议配置服务的格式,因为它对新人和简洁方面很友好,但Symfony也支持XML和PHP配置。ob娱乐下载

使用注释来定义原则实体映射

教义实体是您存储在某些“数据库”中存储的普通PHP对象。Doctrine仅通过为模型类配置的映射元数据了解您的实体。

Doctrine支持几种元数据格式,但建议使用注释,因为它们是迄今为止设置和查找映射信息最方便和敏捷的方式。

控制器

使您的控制器扩展AbstractController基础控制器

ob娱乐下载Symfony提供了一个基本控制器其中包括用于最常见需求的快捷方式,如呈现模板或检查安全权限。

从此管理控制器扩展控制器将您的应用程序耦合到Symfony。ob娱乐下载耦合通常是错误的,但在这种情况下可能还可以,因为控制器不应包含任何业务逻辑。控制器应该包含超过几行胶水代码,因此您不耦合应用程序的重要部分。

使用属性或注释来配置路由、缓存和安全性

使用属性或注释进行路由、缓存和安全性简化了配置。您不需要浏览使用不同格式(YAML、XML、PHP)创建的多个文件:所有配置都是您需要的,而且它只使用一种格式。

不要使用注解配置控制器模板

@模板注释很有用,但也涉及一些问题魔术.而且,大多数时候@模板在没有任何参数的情况下使用,这使得可以更难以知道正在呈现的模板。它还隐藏了控制器应始终返回的事实回答对象。

使用依赖注入获取服务

如果你扩大基数AbstractController,您只能访问最常见的服务(例如枝条路由器学说等),直接从容器通过$ this - >容器> get ()$ this - > get ().相反,您必须使用依赖注入来获取服务类型提示操作方法参数或构造函数参数。

如果方便,请使用参数转换器

如果您正在使用学说,那么你可以(可选)使用ParamConverter自动查询一个实体并将其作为参数传递给控制器。如果找不到实体,它还会显示一个404页面。

如果从路由变量获取实体的逻辑更复杂,则最好在控制器内部进行条令查询(例如,通过调用教义存储库方法).

模板

使用蛇盒进行模板名称和变量

使用小写的snake_case来表示模板名、目录和变量(例如:user_profile而不是userProfile产品/ edit_form.html.twig.而不是产品/ EditForm.html.twig).

使用下划线为模板片段添加前缀

模板碎片,也称为“部分模板”,允许重用模板内容.用下划线前缀他们的名称以更好地将它们与完整模板区分开(例如_user_metadata.html.twig_caution_message.html.twig.).

形式

将表单定义为PHP类

创造形式类允许在应用程序的不同部分重用它们。此外,不在控制器中创建表单简化了控制器的代码和维护。

在模板中添加表单按钮

表格类应不可知论于它们将使用它们的位置。例如,用于创建和编辑项目的表单的按钮应根据所用的位置,“添加新”改变为“保存更改”。

建议在模板中添加按钮,而不是在表单类或控制器中添加按钮。这也改进了关注点的分离,因为按钮样式(CSS类和其他属性)是在模板中定义的,而不是在PHP类中定义的。

但是,如果您创建带有多个提交按钮的表单你应该在控制器中而不是在模板中定义它们。否则,在控制器中处理表单时,将无法检查单击了哪个按钮。

定义基础对象上的验证约束

附加验证约束将字段而不是映射到对象将防止在其他表单或使用对象的其他地方重用验证。

使用单个动作呈现并处理表单

呈现形式处理形式是处理表单时的两个主要任务。两者都非常相似(大多数时候几乎相同),所以让单个控制器操作处理两者要简单得多。

国际化

使用xliff格式进行翻译文件

Symfony支持的所有翻译格式(PHP, Qt,ob娱乐下载.po..mo., JSON, CSV, INI等),XLIFFGetText.在专业翻译人员使用的工具中具有最佳支持。由于它基于XML,您可以验证XLIFF文件内容,因为你写他们。

ob娱乐下载Symfony还支持XLIFF文件中的注释,使它们对翻译人员更加友好。最后,好的翻译都是关于上下文的,这些XLIFF注释允许您定义上下文。

使用键翻译而不是内容字符串

使用键简化了翻译文件的管理,因为您可以更改模板、控制器和服务中的原始内容,而不必更新所有的翻译文件。

钥匙应该总是描述它们意图不是他们的位置。例如,如果表单具有标签“用户名”的字段,则将是一个很好的键label.username.不是edit_form.label.username.

安全

定义单个防火墙

除非您有两个合法的不同身份验证系统和用户(例如,仅为您的API的主站点和令牌系统进行登录),否则它建议只有一个防火墙来保持简单。

此外,您应该使用匿名的密钥在防火墙下。如果您要求用户登录站点的不同部分,请使用访问控制选项

使用汽车密码哈尔

自动密码哈尔根据您的PHP安装自动选择最佳的编码器/ Hasher。从symfony 5.3开始ob娱乐下载,默认的自动哈尔是Bcrypt.

使用投票者实现细粒度的安全限制

如果您的安全逻辑很复杂,则应创建自定义安全的选民而不是在里面定义长长的表达@安全注释。

网络资产

使用WebPack Encore来处理Web资产

Web资产是像CSS、JavaScript和图像文件这样的东西,它们使站点前端看起来和工作起来都很棒。网页包是领先的JavaScript模块绑定器,用于编译、转换和打包资源,以便在浏览器中使用。

Webpack安可是一个JavaScript库,它摆脱了Webpack的大部分复杂性,没有隐藏它的任何特性,也没有扭曲它的用法和原理。它最初是为Symfony应用程序创建的,但它适用于使用任何技ob娱乐下载术的任何应用程序。

测试

烟雾测试你的网址

在软件工程中,烟雾测试由组成初步测试揭示简单的失败,严重到足以拒绝一个预期的软件发布。.使用PHPUnit)数据提供者你可以定义一个功能测试来检查所有的应用url是否成功加载:

/ /测试/ ApplicationAvailabilityFunctionalTest.php名称空间App \测试使用ob娱乐下载Symfony \包\ FrameworkBundle \ \ WebTestCase测试ApplicationAvailabilityFunctionaltest.延伸WebTestCase./*** @dataProvider urlProvider*/平民的函数testPageIsSuccessful$ url$client自己::createClient();$client->要求'得到'$ url);$这一点->assertrecesteSiseucesfess();平民的函数URL提供者()收益率' / '];收益率'/ posts'];收益率' / post / fixture-post-1 '];收益率' /博客/类别/ fixture-category '];收益率“/档案”];// ......

在创建应用程序时添加此测试,因为它只需要很少的工作,并检查没有页面返回错误。稍后,您将为每个页面添加更多特定的测试。

功能测试中的硬编码URL

在Syob娱乐下载mfony应用程序中,它建议使用生成的url使用路由在URL改变时自动更新所有链接。但是,如果一个公共URL发生了变化,用户将无法浏览它,除非您设置了到新URL的重定向。

这就是为什么建议在测试中使用原始url而不是从路由生成url的原因。每当路由更改时,测试将失败,您将知道必须设置重定向。

这项工作,包括代码样本,是根据知识共享BY-SA 3.0许可证。