Symfob娱乐下载ony框架最佳实践
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
Symfob娱乐下载ony框架最佳实践
本文描述了使用Symfony开发web应用程序的最佳实践ob娱乐下载符合Symfony最初创造者所设想的哲学。ob娱乐下载
如果你不同意其中的一些建议,它们可能是一个很好的选择起点这样你就可以扩展并适合您的特定需求.您甚至可以完全忽略它们,并继续使用您自己的最佳实践和方法。ob娱乐下载Symfony足够灵活,可以适应您的需求。
本文假设您已经有了开发Symfony应用程序的经验。ob娱乐下载如果你不知道,请先阅读剩下的部分ob娱乐下载Symfony的欧宝官网下载app文档.
提示
ob娱乐下载Symfony提供了一个名为ob娱乐下载Symfony演示这遵循了所有这些最佳实践,因此您可以在实践中体验它们。
创建项目
使用Symfonob娱乐下载y二进制文件创建Symfony应用程序
Symfob娱乐下载ony二进制文件是在您的机器中创建的可执行命令obb体育 .它提供了多种实用程序,包括创建新Symfony应用程序的最简单方法:ob娱乐下载
1
$ob娱乐下载Symfony新的my_project_name
在底层,这个Symfony二进制命令执行所ob娱乐下载需的作曲家命令创建一个新的Symfonyob娱乐下载应用程序基于当前稳定版本。
使用默认目录结构
除非您的项目遵循强加了某种目录结构的开发实践,否则请遵循默认的Symfony目录结构。ob娱乐下载它是扁平的,不言自明的,并且没有与Symfony耦合:ob娱乐下载
12 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 /├─assets/├─bin/│├─config/│├─packages/│├─services。yaml├─public/│├─build/│├─index.php├─src/│├─Kernel.php│├─Command/│├─Controller/│├─DataFixtures/│├─Entity/│├─EventSubscriber/│├─Form/│├─Migrations/│├─Repository/│├─Security/│├─var/│├─cache/│├─log/├─vendor/
配置
使用环境变量进行基础设施配置
这些选项会从一台机器更改到另一台机器(例如,从开发机器更改到生产服务器),但不会改变应用程序的行为。
在项目中使用env变量定义这些选项并创建多个.env
文件为每个环境配置env变量.
使用应用程序配置参数
这些是用于修改应用程序行为的选项,例如电子邮件通知的发件人或已启用的功能切换.它们的值不会在每台机器上改变,所以不要将它们定义为环境变量。
将这些选项定义为参数在配置/ services.yaml
文件。您可以覆盖这些选项环境在配置/ services_dev.yaml
而且配置/ services_prod.yaml
文件。
使用短的和有前缀的参数名
考虑使用应用程序。
作为你的前缀参数避免与Symfony和第三方bundle /库参数ob娱乐下载冲突。然后,只用一两个词来描述参数的目的:
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;/ /……}
常量的主要优点是可以在任何地方使用它们,包括Twig模板和Doctrine实体,而参数只能从访问服务容器.
对这类配置值使用常量的唯一显著缺点是,在测试中重新定义它们的值很复杂。
业务逻辑
不要创建任何Bundle来组织你的应用逻辑
当Symfob娱乐下载ony 2.0发布时,应用程序使用包将代码划分为逻辑特性:UserBundle、ProductBundle、InvoiceBundle等。然而,包是指可以作为独立的软件部分重用的东西。
如果您需要在项目中重用某些特性,请为其创建一个包(在私有存储库中,而不是使其公开可用)。对于应用程序的其余代码,使用PHP名称空间来组织代码,而不是使用包。
使用自动装配来自动化应用程序服务的配置
服务自动装配是一个读取构造函数(或其他方法)上的类型提示并自动将正确的服务传递给每个方法的特性,无需显式配置服务并简化应用程序维护。
只要可能,服务应该是私有的
使服务私有以防止您通过集装箱- > get ()
.相反,您需要使用适当的依赖项注入。
使用YAML格式配置您自己的服务
如果你使用默认的服务。yaml的配置,大部分服务将自动配置。但是,在某些边缘情况下,您需要手动配置服务(或服务的一部分)。
推荐使用YAML格式配置服务,因为它对新手友好且简洁,但Symfony也支持XML和PHP配置。ob娱乐下载
使用注释来定义理论实体映射
Doctrine实体是存储在某个“数据库”中的普通PHP对象。Doctrine仅通过为模型类配置的映射元数据了解您的实体。
Doctrine支持多种元数据格式,但建议使用注释,因为它们是迄今为止设置和查找映射信息的最方便和敏捷的方式。
控制器
使你的控制器扩展AbstractController
基本控制器
ob娱乐下载Symfony提供了一个基本控制器其中包括最常见需求的快捷方式,如呈现模板或检查安全权限。
从这个基本控制器扩展控制器,将应用程序与Symfony连接起来。ob娱乐下载耦合通常是错误的,但在这种情况下可能没问题,因为控制器不应该包含任何业务逻辑。控制器应该只包含几行胶水代码,因此您没有耦合应用程序的重要部分。
使用注释来配置路由、缓存和安全
使用注释进行路由、缓存和安全简化了配置。您不需要浏览使用不同格式(YAML、XML、PHP)创建的多个文件:所有配置都只是在您需要的地方,并且只使用一种格式。
不要使用注解来配置控制器模板
的@Template
注释是有用的,但也涉及到一些问题魔法.而且,大多数时候@Template
使用时不带任何参数,这使得更难以知道正在呈现哪个模板。它还隐藏了一个事实,即控制器应该总是返回响应
对象。
使用依赖注入获取服务
如果你延伸底部AbstractController
,你只能使用最常用的服务(例如嫩枝
,路由器
,学说
等),直接从集装箱经$ this - >容器> get ()
或$ this - > get ()
.相反,必须使用依赖注入来获取服务类型提示操作方法参数或构造函数参数。
如果方便的话,使用参数转换器
如果你在使用学说,那么你就可以(可选)使用ParamConverter自动查询一个实体并将其作为参数传递给控制器。如果找不到实体,还会显示404页面。
如果从路由变量中获取实体的逻辑更复杂,与其配置ParamConverter,不如在控制器内部进行Doctrine查询(例如调用a理论储存库法).
模板
模板名称和变量使用Snake Case
使用小写的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等)XLIFF和gettext在专业翻译人员使用的工具中有最好的支持。由于它基于XML,所以可以在编写XLIFF文件内容时验证它们。
ob娱乐下载Symfony还支持XLIFF文件中的注释,使它们对翻译人员更加友好。最后,好的翻译都是关于上下文的,而这些XLIFF注释允许您定义上下文。
使用翻译键而不是内容字符串
使用键简化了翻译文件的管理,因为您可以更改模板、控制器和服务中的原始内容,而无需更新所有翻译文件。
键应该总是描述它们目的而且不他们的位置。例如,如果一个表单有一个标签为“Username”的字段,那么一个好的键将是label.username
,不edit_form.label.username
.
安全
定义单一防火墙
除非你有两个合法的不同的认证系统和用户(例如,主站点的表单登录和API的令牌系统),否则建议只使用一个防火墙以保持简单。
此外,您应该使用匿名
防火墙下的密钥。如果要求用户登录站点的不同部分,请使用access_control选择。
使用投票者实现细粒度的安全限制
如果您的安全逻辑很复杂,您应该创建自定义安全的选民类中定义长表达式@Security
注释。
网络资产
使用Webpack Encore来处理Web资产
Web资产是像CSS, JavaScript和图像文件这样的东西,使你的网站的前端看起来和工作得很好。Webpack是领先的JavaScript模块打包器,它编译、转换和打包资产以供在浏览器中使用。
Webpack安可是一个JavaScript库,它摆脱了Webpack的大部分复杂性,而不隐藏它的任何特性或扭曲它的用法和哲学。它最初是为Symfony应用程序创建的,但它适用于使用任何技ob娱乐下载术的任何应用程序。
测试
烟雾测试你的url
在软件工程领域,冒烟测试由初步测试,以揭示简单的故障,严重到足以拒绝一个预期的软件发布.使用PHPUnit数据提供程序你可以定义一个功能测试,检查所有应用程序的url是否加载成功:
12 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名称空间应用程序\测试;使用ob娱乐下载\包\FrameworkBundle\测试\WebTestCase;类ApplicationAvailabilityFunctionalTest扩展WebTestCase{/ * * *@dataProviderurlProvider * /公共函数testPageIsSuccessful($url){$客户端=自我::createClient ();$客户端->请求(“得到”,$url);$这->assertResponseIsSuccessful ();}公共函数urlProvider(){收益率[' / '];收益率[' /帖子'];收益率[' / post / fixture-post-1 '];收益率[' /博客/类别/ fixture-category '];收益率[“/档案”];/ /……}}
在创建应用程序时添加此测试,因为它只需要很少的工作,并检查所有页面是否都返回错误。稍后,您将为每个页面添加更具体的测试。
在功能测试中硬编码url
在Syob娱乐下载mfony应用程序中,建议这样做生成的url当URL改变时,使用路由自动更新所有链接。但是,如果一个公共URL改变了,用户将无法浏览它,除非你设置一个重定向到新的URL。
这就是为什么建议在测试中使用原始url,而不是从路由生成它们。每当路由更改时,测试就会中断,您将知道必须设置重定向。