最佳实践可重用的包

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

最佳实践可重用的包

你的这篇文章是关于如何结构可重复使用的包可配置的和可扩展的。可重用的包是为了共享私下在许多公司项目或公开任何Symfony项目可以安装。ob娱乐下载

包的名字

包也是一个PHP名称空间。名称空间必须遵守PSR-4互操作性标准PHP名称空间和类名:它开始于一个供应商,其次是零个或多个类别细分,它以名称空间短名称,必须结束

一个名称空间变成一个包就添加“包班”(这是一个扩展的类)。包类名称必须遵循这些规则:

  • 只使用字母数字字符和下划线;
  • 使用一个StudlyCaps名称(即camelCase大写首字母);
  • 使用描述性和短名称(不超过两个词);
  • 前缀的名称与连接供应商(和可选的类别名称空间);
  • 后缀的名字

这里有一些有效的包命名空间和类名:

名称空间 包类名
Acme \包\ BlogBundle AcmeBlogBundle
Acme \ BlogBundle AcmeBlogBundle

按照惯例,getName ()包类的方法应该返回的类名。

请注意

如果你公开分享你的包,你必须使用包类名称的名称存储库(例如AcmeBlogBundle而不是BlogBundle)。

请注意

ob娱乐下载Symfony核心包不包类前缀ob娱乐下载而且总是添加一个sub-namespace;例如:FrameworkBundle

每个包都有一个别名,它是小写字母的简短版的包名称使用下划线(acme_blogAcmeBlogBundle)。这个别名用于执行独特性在一个项目中,定义包的配置选项(见下面的一些用法示例)。

目录结构

以下是推荐一个AcmeBlogBundle的目录结构:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

                 
                  /├──配置/├──docs /│└─指数。md├──公共/├──src /│├──控制器/│├──DependencyInjection /│└──AcmeBlogBundle。php├──模板/├──测试/├──翻译/├──许可证└──README.md

这个目录结构需要配置包路径的根目录如下:

1 2 3 4 5 6 7
AcmeBlogBundle扩展{公共函数getPath():字符串{返回\目录名(__DIR__);}}

以下文件是强制性的,因为他们保证一个自动化工具可以依靠的结构公约:

  • src / AcmeBlogBundle.php:这是将一个普通目录转换为一个Symfony的类包(改变这个包的名称);ob娱乐下载
  • README.md:此文件包含包的基本描述,它通常显示一些基本例子和它的全部文档的链接(它可以使用任何标记的格式在GitHub的支持下,等欧宝官网下载appREADME.rst);
  • 许可证:使用的许可证代码的完整内容。大多数第三方包在MIT许可下发布的,但是你可以选择任何许可;
  • 文档/ index.md:包的根文件文档。欧宝官网下载app

子目录的深度应保持在最低限度的最常用类和文件。两个层次是最大的。

包目录是只读的。如果你需要写临时文件,将它们存储在缓存/日志/主机应用程序的目录。工具可以生成包中的文件目录结构,但前提是生成的文件将存储库的一部分。

以下类和文件有特定的阵地(有些是强制性的和其他人只是约定其次是大多数开发人员):

类型 目录
命令 src /命令/
控制器 src /控制器/
服务容器扩展 src / DependencyInjection /
教义ORM实体(当不使用注释) src /实体
教义ODM文件(当不使用注释) src /文档/
事件监听器 src / EventListener /
配置(路线、服务等) 配置/
网络资产(CSS、JS、图片) 公共/
翻译文件 翻译/
验证(当不使用注释) 配置/验证/
序列化(当不使用注释) 配置/序列化/
模板 模板/
单元测试和功能测试 测试/

包目录结构作为名称空间的层次结构。例如,一个ContentController存储在控制器src /控制器/ ContentController.php完全限定类名的吗Acme \ BlogBundle \ \ ContentController控制器

所有类和文件必须遵守ob娱乐下载Symfony的编码标准

一些类应被视为立面,应该尽可能短,如命令、助手、听众和控制器。

类连接到事件分配器应该后缀为侦听器

应该存储在一个异常类异常sub-namespace。

供应商

一捆不能嵌入第三方PHP库。它应该依赖于标准的Symfony半自动的。ob娱乐下载

一捆也应该不是嵌入JavaScript编写的第三方库,CSS或任何其他语言。

测试

包应该有一个测试套件用PHPUnit)和存储测试/目录中。测试应该遵循以下原则:

  • 测试套件必须与一个简单的可执行文件phpunit)命令从一个示例应用程序运行;
  • 功能测试应该只被用来测试响应输出和一些分析信息如果你有;
  • 测试应该覆盖至少95%的代码库。

请注意

一个测试套件必须不包含AllTests.php脚本,但是必须依靠的存在phpunit.xml.dist文件。

持续集成

不断测试包的代码,包括所有的提交和拉请求,是一个很好的实践称为持续集成。有几个服务免费提供这个特性对于开放源码项目,GitHub的行为特拉维斯CI

一捆至少应该测试:

  • 下界的依赖项(通过运行作曲家更新——prefer-lowest);
  • 支持PHP版本;
  • 所有支持的主要Symfony版本(例如ob娱乐下载4.倍5.倍如果都声称支持)。

因此,包支持PHP 7.3, 7.4和8.0,Symfony 4.4和5。ob娱乐下载x至少应该有这个测试矩阵:

PHP版本 ob娱乐下载Symfony的版本 作曲家的旗帜
7.3 4 . * ——prefer-lowest
7.4 5 . *
8.0 5 . *

提示

测试应该与运行ob娱乐下载SYMFONY_DEPRECATIONS_HELPERenv变量设置为马克斯(直接)= 0。这样可以确保没有代码包中使用直接弃用功能。

最低的依赖性测试可以使用这个变量设置为运行禁用= 1

需要一个特定的Symfony的版本ob娱乐下载

您可以使用特殊的ob娱乐下载SYMFONY_REQUIRE环境变量一起Symfony Flex安装特定的Symfony版本:ob娱乐下载

1 2 3 4 5 6 7 8 9
5 #这需要Symfony。ob娱乐下载x Symfony包ob娱乐下载出口ob娱乐下载SYMFONY_REQUIRE = 5。*#安装Symfonyob娱乐下载 Flex在CI环境中作曲家全球需要——没有任何进展——没有剧本——no-plugins symfony / flexob娱乐下载#安装的依赖关系(使用——prefer-dist和没有任何进展#推荐有更好的输出和更快的下载时间)作曲家更新——prefer-dist——没有任何进展

谨慎

如果你想要缓存作曲家依赖关系,缓存供应商/目录的副作用。而不是缓存$ HOME / .composer /缓存/文件

安装

包应该设定“类型”:“symob娱乐下载fony-bundle”在他们的composer.json文件。用这个,ob娱乐下载Symfony Flex能够自动启用您的安装包的时候。

如果你的包需要任何设置(例如配置,新文件,更改.gitignore等),那么您应该创建一个ob娱乐下载Symfony Flex食谱

欧宝官网下载app

所有的类和函数必须有完整的PHPDoc。

丰富的文档也应该提供欧宝官网下载app的文档/目录中。索引文件(例如文档/ index.rst文档/ index.md)是唯一强制性的文件,必须文档的入口点。欧宝官网下载app的reStructuredText (rST)用于呈现文档的格式在Symfony的网站。欧宝官网下载appob娱乐下载

安装说明

为了减轻第三方的安装包,在你考虑使用以下标准指令README.md文件。

  • 减价
  • RST
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 30 31 32 33 34 35 36 37 38 39 40 41
安装= = = = = = = = = = = =确保安装了作曲家在全球范围内,在[解释安装一章)(https://getcomposer.org/doc/00-intro.md作曲家的文档。欧宝官网下载app使用Symfony的Flex应用程序- - ob娱乐下载- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -打开一个命令控制台,输入你的项目目录并执行:““控制台作曲家美元需要<包名称>”“应用程序不使用Symfony Flex - - - - ob娱乐下载- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# # #第1步:下载包打开一个命令控制台,输入你的项目目录并执行以下命令来下载最新的稳定版本的包:““控制台作曲家美元需要<包名称>”“# # #第二步:使包然后,使包通过将其添加到注册包的列表“配置/ bundles.php”您的项目的文件:' ' ' php / / config /包。php返回[/ /……<供应商> \ < bundle-name > \ < bundle-long-name >::类= > '所有' = > true,];' ' '

上面的示例假设您正在安装最新的稳定版本的包,你不需要提供(如包版本号。作曲家需要friendsofsymfony / usob娱乐下载er-bundle)。如果安装说明请参考一些过去的bundle版本或不稳定的版本,包括版本约束(如。作曲家需要friendsofsymfony / usob娱乐下载er-bundle“~ 2.0 @dev”)。

可选地,您可以添加更多的安装步骤(步骤3,步骤4等)来解释其他必需的安装任务,如登记线路或抛售资产。

路由

如果包提供的路线,他们必须以包为前缀的别名。例如,如果您的包叫AcmeBlogBundle,所有的路线必须前缀acme_blog_

模板

如果一个包提供了模板,他们必须使用树枝。一捆不能提供主要布局,除非它提供了一个完整的应用程序。

翻译文件

如果一个包提供消息翻译,他们必须定义在XLIFF格式;域应该包命名的名称(acme_blog)。

一捆不能覆盖现有的消息来自另一个包。

配置

提供更大的灵活性,一个包可以提供可配置的设置通过使用Symfony的内置机制。ob娱乐下载

对于简单的配置设置,依赖于默认参数Symfony的配置条目。ob娱乐下载ob娱乐下载Symfony参数简单的键/值对;价值是任何有效的PHP价值。每个参数的名字应该开始包别名,虽然这只是一个最佳实践建议。其余的参数名称将使用一段时间()独立的不同部分(如。acme_blog.author.email)。

最终用户可以提供值在任何配置文件:

  • YAML
  • XML
  • PHP
1 2 3
#配置/ services.yaml参数:acme_blog.author.email:“fabien@example.com”

从容器中检索代码中配置参数:

1
美元容器- >getParameter (“acme_blog.author.email”);

这种机制要求最少的努力时,你应该考虑使用更高级的语义包配置使您的配置更健壮。

版本控制

包必须后版本语义版本控制标准

服务

如果包定义了服务,他们必须与包别名前缀,而不是使用完全限定类名像你在你的项目服务。例如,AcmeBlogBundle服务必须前缀acme_blog。原因是包不应该依赖特性,比如服务自动装配或自动配置编译应用程序服务时不施加额外的开销。

此外,服务不是直接使用的应用程序,应该定义为私有。为公共服务,应该创建别名从接口/类服务id。例如,在MonologBundle,创建一个别名Psr \ \ LoggerInterface日志日志记录器这样LoggerInterfacetype-hint可用于自动装配。

不应该使用自动装配或自动配置的服务。相反,所有的服务都应该明确定义。

另请参阅

你可以了解更多关于服务加载包读这篇文章:如何加载服务配置在一个包吗

作曲家的元数据

composer.json元数据文件至少应包括下列:

的名字
由供应商和短包的名字。如果你是释放自己包,而不是代表一个公司,(如使用你的个人名字。/那blog-bundle)。排除卖方的名字从包短名称和单独的每个单词字符。例如:AcmeBlogBundle转化为blog-bundle和AcmeSocialConnectBundle转化为social-connect-bundle
描述
包的目的的简要说明。
类型
使用ob娱乐下载symfony-bundle价值。
许可证
一个字符串(字符串或数组)有效的许可证标识符,如麻省理工学院
自动装载

这些信息使用Symfony加载的类的包。ob娱乐下载推荐使用PSR-4自动装载标准:使用名称空间是关键,包的位置(相对于主要的类composer.json)的价值。主类位于src /包的目录:

1 2 3 4 5 6 7 8 9 10 11 12
{“自动”:{“psr-4”:{“Acme \ \ BlogBundle \ \”:“src /”}},“autoload-dev”:{“psr-4”:{“Acme \ \ BlogBundle \ \测试\ \”:“测试/”}}}

为了使开发人员更容易找到你的包,注册它Packagist,作曲家的官方库包。

资源

如果包引用任何资源(配置文件,翻译文件等),不使用(如物理路径。__DIR__ /配置/ services . xml(如),但逻辑路径。@AcmeBlogBundle /配置/ services . xml)。

的逻辑路径是必需的,因为包覆盖机制,允许您覆盖的任何资源/文件包。看到HttpKernel组件更多细节将物理路径转换为逻辑路径。

注意,模板使用一个简化的版本上面所示的逻辑路径。例如,一个index.html.twig模板位于模板/违约/AcmeBlogBundle目录,作为引用@AcmeBlog /违约/ index.html.twig

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