Symf欧宝娱乐app下载地址ony框架的最佳实践

编辑该页面

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

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

Symf欧宝娱乐app下载地址ony框架的最佳实践

本文描述了用Symfony开发web应用程序的最佳实践欧宝娱乐app下载地址符合哲学设想由原Symfony创造者。欧宝娱乐app下载地址

如果你不同意其中的一些建议,他们可能是一个不错的起点然后,你可以扩展和适合您的特定需求。你甚至可以完全忽略它们,继续使用自己的最佳实践和方法。欧宝娱乐app下载地址Symfony足够灵活以适应您的需要。

本文假设您已经有经验开发Symfony应用程序。欧宝娱乐app下载地址如果你不,首先阅读开始部分的文档。欧宝体育电话

提示

欧宝娱乐app下载地址Symfony提供了一个示例应用程序欧宝娱乐app下载地址Symfony演示遵循这些最佳实践,所以你可以在实践中体验它们。

创建项目

使用Symfon欧宝娱乐app下载地址y的二进制创建Symfony应用程序

Symf欧宝娱乐app下载地址ony二进制可执行命令中创建您的机器时OB体育 。它提供了多个工具,包括最简单的方法创建新的Symfony应用程序:欧宝娱乐app下载地址

1
美元欧宝娱乐app下载地址symfony新my_project_name

下罩,Symfony二进制命令执行时所需欧宝娱乐app下载地址作曲家命令创建一个新的Symfony欧宝娱乐app下载地址应用程序基于当前的稳定版本。

使用默认的目录结构

除非你的项目遵循的开发实践带来一定的目录结构,按照默认Symfony的目录结构。欧宝娱乐app下载地址它是平的,一目了然,而不是耦合的Symfony:欧宝娱乐app下载地址

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└─公共/│├─构建/│└─指数。php├─src /│├─内核。命令/ php│├─│├─控制器/│├─DataFixtures /│├─实体/│├─EventSubscriber /│├─形式/│├─迁移/│├─库/│├─安全/│└─树枝/├─模板/├─测试/├─翻译/├─var /│├─缓存/│└─日志/└─供应商/

配置

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

这些选项改变从一台机器到另一个(例如,从开发机器到生产服务器),但不改变应用程序的行为。

在您的项目使用env var这些选项来定义和创建多个.env文件配置env var /环境

对敏感信息使用的秘密

当你的应用程序有敏感的配置——就像一个API密匙——你应该存储那些安全地通过秘密

为应用程序配置使用参数

这些选项用于修改应用程序的行为,例如邮件通知的发送者,或启用功能切换。每台机器的价值并没有改变,所以不要将他们定义为环境变量。

这些选项定义为参数配置/ services.yaml文件。你可以覆盖这些选项/环境配置/ services_dev.yaml配置/ services_prod.yaml文件。

使用短和前缀的参数名称

考虑使用应用程序。的前缀参数为了避免碰撞与Symfony和第三方包/库参数。欧宝娱乐app下载地址然后,使用只有一个或两个词来描述参数的目的:

1 2 3 4 5 6 7 8 9 10
#配置/ services.yaml参数:#不这样做:“dir”是通用的,它不表达任何意思app.dir:“……”#这样做:短暂而容易理解的名字app.contents_dir:“……”#这是可以使用点,突显出,破折号或什么,但总是#是一致的所有参数和使用相同的格式app.dir.contents:“……”app.contents-dir:“……”

使用常量定义选项很少改变

配置选项等物品的数量显示在一些清单很少变化。而不是将他们定义为服务容器参数,定义PHP常数相关的类。例子:

1 2 3 4 5 6 7 8 9
/ / src /实体/ Post.php名称空间应用程序\实体;帖子{公共常量NUMBER_OF_ITEMS =10;/ /……}

常数的主要优势是,您可以使用它们无处不在,包括树枝模板和教义的实体,而参数只能从访问的地方服务容器

唯一显著的缺点使用常数对于这种配置值是复杂的重新定义他们的价值观在测试中。

业务逻辑

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

Symfo欧宝娱乐app下载地址ny 2.0发布的时候,应用程序使用把代码分成逻辑特点:UserBundle, ProductBundle, InvoiceBundle,等等。然而,一捆是可以作为一个独立的软件重用。

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

使用自动装配自动化应用程序服务的配置

服务自动装配是一个功能,读取类型提示放在构造函数(或其他方法),并自动将正确的服务传递给每一个方法,使不必要的配置服务明确和简化了应用程序的维护。

结合使用它服务自动配置也添加服务标签需要他们的服务,如树枝扩展,事件订阅者,等等。

尽可能的服务应该是私有的

使服务私人通过阻止你访问这些服务$容器- > get ()。相反,您将需要使用适当的依赖注入。

使用YAML格式配置自己的服务

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

YAML格式建议配置服务,因为它是对新人很友好简洁,但Symfony还支持XML和PHP配置。欧宝娱乐app下载地址

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

教义实体是纯PHP对象存储在一些“数据库”。教义只有知道您的实体通过映射元数据配置为您的模型类。

学说支持多个元数据格式,但它是推荐使用注释,因为他们是目前最方便、灵活的方式建立和寻找映射信息。

控制器

让你的控制器扩展AbstractController基本控制器

欧宝娱乐app下载地址Symfony提供了一个基本控制器其中包括快捷键等最常见的需求呈现模板或检查安全权限。

扩展控制器从这个基地控制器夫妇Symfony应用程序。欧宝娱乐app下载地址耦合通常是错误的,但它可能是在这种情况下,因为控制器不应该包含任何业务逻辑。控制器应该包含几行胶水代码,所以你不是耦合应用程序的重要部分。

使用注释来配置路由缓存和安全

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

不使用注释来配置控制器模板

@Template注释是很有用的,但也涉及到一些魔法。此外,大部分的时间@Template没有使用任何参数,这使得很难知道哪个模板被呈现。它还隐藏了一个控制器应该返回一个响应对象。

使用依赖注入来获取服务

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

使用ParamConverters如果他们方便

如果您正在使用学说,那么你就可以(可选)使用ParamConverter自动查询一个实体并将它作为参数传递给控制器。它还将展示一个404页的如果没有实体可以被发现。

如果一个实体的逻辑路径变量更加复杂,而不是配置ParamConverter,最好让控制器内的教义查询(例如通过打电话来教义库方法)。

模板

使用蛇为模板名称和变量

使用小写的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,欧宝娱乐app下载地址.po,mo、JSON、CSV、INI等)XLIFF和gettext有最好的专业翻译人员所使用的工具的支持。,因为它是基于XML的,您可以验证XLIFF文件内容编写。

欧宝娱乐app下载地址Symfony还支持在XLIFF文件,使他们更用户友好的翻译。最后,良好的翻译都是关于上下文,这些XLIFF注释允许您定义上下文。

使用键翻译而非内容的字符串

使用钥匙简化翻译文件的管理,因为你可以改变原来的内容模板,控制器和服务,而无需更新所有的翻译文件。

键应该描述他们目的他们的位置。例如,如果一个表单有一个字段标签的“用户名”,那么一个关键label.username,edit_form.label.username

安全

定义一个防火墙

除非你有两个合法的不同的身份验证系统和用户登录(如形式主要网站和一个令牌系统仅供您的API),它的建议只有一个防火墙让事情变得简单。

此外,您应该使用匿名关键在你的防火墙。如果你需要登录用户对你的网站的不同部分,使用access_control选择。

使用汽车密码切肉机

自动密码切肉机自动选择最好的编码器/厨师根据您的PHP安装。目前,它试图使用默认情况下,落回bcrypt

使用选民来实现细粒度的安全限制

如果您的安全逻辑很复杂,你应该创建自定义安全的选民而不是定义内长表达式@Security注释。

网络资产

使用Webpack安可来处理网络资产

网络资产CSS、JavaScript和图像文件,让网站的前端外观和伟大的工作。Webpack是最主要的JavaScript编译模块打包机,转换和包资产在浏览器中使用。

Webpack安可是一个JavaScript库,摆脱大部分Webpack复杂性没有隐瞒任何的特性或扭曲其用法和哲学。它最初是为Symfony创建应用程序,但它使用任何技术适用于欧宝娱乐app下载地址任何应用程序。

测试

冒烟测试你的url

在软件工程中,冒烟测试“初步测试揭示简单故障严重程度足以拒绝未来的软件发布”。使用PHPUnit)数据提供者您可以定义一个功能测试,检查所有应用程序的url加载成功:

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
/ /测试/ ApplicationAvailabilityFunctionalTest.php名称空间应用程序\测试;使用欧宝娱乐app下载地址\\FrameworkBundle\测试\WebTestCase;ApplicationAvailabilityFunctionalTest扩展WebTestCase{/ * * *@dataProviderurlProvider * /公共函数testPageIsSuccessful(美元url){美元客户端=自我::createClient ();美元客户端- >请求(“得到”,美元url);美元- >assertResponseIsSuccessful ();}公共函数urlProvider(){收益率(' / '];收益率(' /帖子'];收益率(' / post / fixture-post-1 '];收益率(' /博客/类别/ fixture-category '];收益率(“/档案”];/ /……}}

添加这个测试在创建您的应用程序,因为它需要很少的努力和检查页面没有返回一个错误。以后你会为每个页面添加更具体的测试。

功能测试中硬编码的url

在Sy欧宝娱乐app下载地址mfony应用程序建议生成的url使用路由变化时自动更新所有链接URL。然而,如果一个公共URL更改,用户无法浏览它,除非你建立了一个重定向到新的URL。

这就是为什么推荐使用原始url的测试,而不是生成的路线。只要路线发生变化,测试将打破,你会知道,你必须设置一个重定向。

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