Symfony的配置欧宝娱乐app下载地址

编辑该页面

Symfony的配置欧宝娱乐app下载地址

配置文件

欧宝娱乐app下载地址Symfony应用程序配置文件中存储配置/目录,这个默认结构:

1 2 3 4 5 6 7
你的项目/├─配置/│├─包/│├─包。php│├─路线。yaml│└─服务。yaml├─……

routes.yaml文件定义了路由配置;的services.yaml文件配置的服务服务容器;的bundles.php文件在应用程序中启用/禁用包。

你会主要是在工作配置/包/目录中。该目录存储每个包的配置安装在您的应用程序。包(也称为“包”在Symfony和“插件/模块”在其他项目)现成的功能欧宝娱乐app下载地址添加到您的项目。

当使用欧宝娱乐app下载地址Symfony Flex在Symfony应用程序中默认启用,包更新欧宝娱乐app下载地址bundles.php文件并创建新文件配置/包/时自动安装。例如,这是默认文件创建的“API平台”包:

1 2 3 4
#配置/包/ api_platform.yamlapi_platform:映射:道路:(“% kernel.project_dir % / src /实体”)

把配置分成很多小文件是一些Symfony新来的恐吓。欧宝娱乐app下载地址然而,你会适应他们很快和你很少需要改变这些文件后包安装

提示

了解所有可用的配置选项,查看欧宝娱乐app下载地址Symfony的配置参考或运行配置:dump-reference命令。

配置格式

与其他框架,Symfony没有特定格式强加给您配置欧宝娱乐app下载地址您的应用程序。欧宝娱乐app下载地址Symfony允许您选择YAML、XML和PHP和Symfony文档,所有配置将显示在这三个例子的格式。欧宝体育电话

5.1

从5.1 Symfony开始欧宝娱乐app下载地址,默认情况下Symfony只加载配置文件中定义的YAML格式。如果您定义XML中的配置和/或PHP格式,更新src / Kernel.php文件添加支持. xml. php被覆盖的文件扩展名configureContainer ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src / Kernel.php使用欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器\ContainerConfigurator;使用欧宝娱乐app下载地址\组件\HttpKernel\内核作为BaseKernel;内核扩展BaseKernel{/ /……私人函数configureContainer(ContainerConfigurator美元容器):无效{美元configDir=美元- >getConfigDir ();美元容器- >导入(美元configDir' /{包}/ * {yaml、php}’。);美元容器- >导入(美元configDir' /{包}/ '美元- >环境。“/ * {yaml、php}’。);如果(is_file (美元configDir' / services.yaml ')){美元容器- >导入(美元configDir' / services.yaml ');美元容器- >导入(美元configDir' /{服务}_ '美元- >环境。“.yaml”);}其他的{美元容器- >导入(美元configDir' /{服务}. php ');}}}

没有任何实际的格式的区别。事实上,Symfo欧宝娱乐app下载地址ny将和缓存全部转换为PHP在运行应用程序之前,所以没有任何性能差别。

YAML使用默认安装包时,因为它的简洁和非常可读。这些是每个格式的主要优点和缺点:

  • YAML:简单、清洁和可读,但不是所有的ide支持自动完成和验证。YAML的语法学习;
  • XML解析:自动完成/验证大多数ide和本地的PHP,但有时它生成配置太冗长。学习XML语法;
  • PHP:非常强大,它允许您创建动态配置与数组或一个ConfigBuilder

导入配置文件

欧宝娱乐app下载地址Symfony加载配置文件使用配置组件提供高级功能如进口其他配置文件,即使他们使用不同的格式:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/ services.yaml进口:- - - - - -{资源:“legacy_config.php”}#水珠表达式也支持加载多个文件- - - - - -{资源:“/ etc / myapp / * .yaml”}# ignore_errors: not_found默默地丢弃错误如果加载文件不存在- - - - - -{资源:“my_config_file.xml”,ignore_errors:not_found}# ignore_errors:真默默地丢弃所有错误(包括无效的代码并没有找到)- - - - - -{资源:“my_other_config_file.xml”,ignore_errors:真正的}#……

配置参数

有时在几个配置文件使用相同的配置值。而不是重复它,你可以将其定义为“参数”,这就像一个可重用的配置值。按照惯例,在定义参数参数的关键配置/ services.yaml文件:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#配置/ services.yaml参数:#参数名称是一个任意的字符串(建议应用。前缀#为了更好的区分你的参数从Symfony参数)。欧宝娱乐app下载地址app.admin_email:“something@example.com”#布尔参数app.enable_v2_protocol:真正的# /集合参数数组app.supported_locales:(“en”,“西文”,“fr”]#二进制内容参数(编码的内容base64_encode ())app.some_parameter:二进制! !VGhpcyBpcyBhIEJlbGwgY2hhciAH# PHP常量参数值app.some_constant:php !/常量GLOBAL_CONSTANTapp.another_constant:php !/常量App \实体\博客::MAX_ITEMS#……

谨慎

当使用XML配置之间的值<参数>标签不是削减了。这意味着以下参数的值“\ n something@example.com \ n”:

1 2 3
<参数关键=“app.admin_email”>something@example.com< /参数>

一旦定义,你可以参考这个参数值从任何其他配置文件使用一个特殊的语法:包装在两个参数的名字%(如。% app.admin_email %):

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/包/ some_package.yamlsome_package:#任何字符串包围两个%被参数值email_address:“% app.admin_email %”#……

请注意

如果一些参数值包括%性格,你需要逃离它通过添加另一个%所以S欧宝娱乐app下载地址ymfony不考虑它的引用参数名称:

  • YAML
  • XML
  • PHP
1 2 3 4
#配置/ services.yaml参数:#解析为“https://symfony.欧宝娱乐app下载地址com/?foo=%s&酒吧= % d 'url_pattern:“https://欧宝娱乐app下载地址www.oldmanjams.com/?foo=%%s&酒吧= % % d '

请注意

由于参数的方式解决,你不能使用它们来构建路径动态进口。这意味着像以下不工作:

  • YAML
  • XML
  • PHP
1 2 3
#配置/ services.yaml进口:- - - - - -{资源:' % kernel.project_dir % / somefile.yaml '}

在Symfony应用程序配置参数是非常普遍的。欧宝娱乐app下载地址甚至一些包定义自己的参数(如安装翻译包时,一个新的语言环境参数被添加到配置/ services.yaml文件)。

另请参阅

在本文的后面,您可以阅读如何在控制器配置参数和服务

配置环境

你只有一个应用程序,但你是否意识到这一点,你需要在不同的时间不同:

  • 发展中,你想记录一切,让好调试工具;
  • 部署后生产,你想要同样的应用程序优化速度和原木的错误。

文件存储在配置/包/使用Symfony的配置欧宝娱乐app下载地址应用程序服务。换句话说,你可以改变应用程序的行为通过改变配置文件加载。Symfony的想法欧宝娱乐app下载地址配置环境

一个典型的Symfo欧宝娱乐app下载地址ny应用始于三个环境:dev(为当地发展),刺激(用于生产服务器)和测试(自动化测试)。当运行应用程序时,Symfony加载配置文件在这个秩序(最后欧宝娱乐app下载地址一个文件可以覆盖之前的设置值):

  1. / * .yaml配置/包(和* . xml*。php文件);
  2. 配置/包/ < environment-name > / * .yaml(和* . xml*。php文件);
  3. 配置/ services.yaml(和services . xmlservices.php文件);
  4. 配置/ services_ < environment-name > .yaml(和services_ < environment-name > . xmlservices_ < environment-name >。php文件)。

框架包,安装在默认情况下,作为一个例子:

  • 首先,配置/包/ framework.yaml在所有环境中加载配置框架有一些选项;
  • 刺激环境,没有额外的将没有配置/包/刺激/ framework.yaml文件;
  • dev环境中,没有文件(配置/包/ dev / framework.yaml不存在)。
  • 测试环境中,配置/包/测试/ framework.yaml加载文件覆盖先前配置的一些设置配置/包/ framework.yaml

在现实中,每个环境只有从别人有点不同。这意味着所有环境有一大群共同配置,直接放入文件配置/包/目录中。

提示

5.3

不同的环境在一个文件中定义的能力是在Symfony 5.3中引入的。欧宝娱乐app下载地址

您还可以定义选项不同的环境在一个配置文件使用特殊的关键字:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
#配置/包/ webpack_encore.yamlwebpack_encore:#……output_path:“% kernel.project_dir % /公共建设”strict_mode:真正的缓存:#启用缓存只在“刺激”的环境when@prod:webpack_encore:缓存:真正的#禁用严格模式只在“测试”的环境when@test:webpack_encore:strict_mode:# YAML语法允许重用内容使用“锚”(&some_name)和“别名”(* some_name)。#在这个例子中,“测试”配置使用相同的配置,在“刺激”when@prod:&webpack_prodwebpack_encore:#……when@test:* webpack_prod

另请参阅

看到configureContainer ()的方法内核类学习一切的加载顺序配置文件。

选择积极的环境

欧宝娱乐app下载地址Symfony应用程序有一个文件.env位于项目根目录。这个文件是用于定义环境变量的值,详细解释在本文的后面

打开.env文件(或更好.env.local文件如果你创建一个)和编辑的价值APP_ENV变量来改变应用程序所运行的环境。例如,在生产中运行应用程序:

1 2
# .env(或.env.local)APP_ENV =刺激

这个值为web和用于控制台命令。然而,你可以覆盖它通过设置命令APP_ENV价值在运行之前:

1 2 3 4 5
#使用环境.env文件中定义美元php command_name bin /控制台#忽略.env文件并在生产中运行此命令美元command_name APP_ENV = prod php bin /控制台

创建一个新的环境

默认三个环境Symfony提供了足以让大多数项目,但你也可以定义自己的环境。欧宝娱乐app下载地址例如,您可以定义一个暂存环境中,客户可以测试项目在生产:

  1. 创建一个配置目录名称相同的环境(在这种情况下,配置/包/分期/);
  2. 添加需要的配置文件配置/包/分期/定义新环境的行为。欧宝娱乐app下载地址Symfony加载/ * .yaml配置/包文件第一,所以你只需要配置这些文件的差异;
  3. 选择暂存环境使用APP_ENVenv var在前一节中解释。

提示

这是常见的环境相似,所以您可以使用符号链接之间的/ < environment-name > / config /包目录重用相同的配置。

而不是创建新环境,您可以使用环境变量下一节中解释。用这种方法,你可以使用相同的应用程序和环境(如刺激),但改变其行为由于配置基于环境变量(例如运行应用程序在不同的场景中:分期,质量保证,客户审查,等等)。

基于环境变量配置

使用环境变量(简称“env var)是一种常见的做法,配置选项,取决于应用程序运行(例如数据库凭证通常是不同的在生产和你的本地机器上)。如果值是敏感的,你甚至可以加密他们的秘密

使用特殊的语法% env (ENV_VAR_NAME) %引用环境变量。这些选项的值在运行时解析(每个请求只有一次,不影响性能),这样你就可以改变应用程序的行为,而不必清除缓存。

这个例子展示了如何使用一个env var:配置数据库连接

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/包/ doctrine.yaml原则:dbal:#按照惯例env var的名字总是大写url:' % env(解决:DATABASE_URL) %#……

5.3

env ()配置器的语法是在5.3中引入的。在PHP配置文件,它将使基于处理器的名字(即自动完成方法。env (SOME_VAR) - >默认(“foo”))。

另请参阅

env var的值只能是字符串,但Symfony包括一些欧宝娱乐app下载地址env var处理器将它们的内容(例如,将一个字符串值转化为整数)。

定义env var的价值,你有几个选择:

提示

一些主机——比如SymfonyClo欧宝娱乐app欧宝体育应用最新版app下载下载地址ud——提供容易公用事业管理env var在生产中。

请注意

一些配置功能不兼容env var。例如,定义一些容器参数条件基于另一个配置选项的存在。当使用env var,配置选项总是存在,因为它的价值当相关env变量没有定义。

谨慎

注意,倾销的内容$ _SERVER_ENV美元变量或输出phpinfo ()内容会显示环境变量的值,暴露敏感信息,比如数据库凭证。

env var的值也暴露的web界面欧宝娱乐app下载地址Symfony分析器。在实践中这不该是一个问题,因为网络分析器必须从来没有在生产中被激活。

.env文件中配置环境变量

而不是定义env var shell或您的web服务器,Symfony提供了一个方便的方式来定义内欧宝娱乐app下载地址.env(大点)文件位于您的项目的根源。

.env文件读取和解析对每个请求及其env vars被添加到_ENV美元&$ _SERVERPHP变量。任何现有env var从来没有被中定义的值覆盖.env,所以你可以结合。

例如,定义DATABASE_URLenv var本文前面所示,您可以添加:

1 2
# .envDATABASE_URL =“mysql: / / db_user: db_password@127.0.0.1:3306 / db_name”

这个文件应该致力于您的存储库,(由于这一事实)应该只包含“默认”值,对地方发展有好处。这个文件不应包含生产价值。

除了自己的env var,.env文件还包含了定义的env var第三方包安装在您的应用程序(它们是自动添加的欧宝娱乐app下载地址Symfony Flex当安装包)。

提示

.env对每个请求进行文件读取和解析,你不需要清除Symfony PHP缓存或重新启动容器如果你使用码头工人。欧宝娱乐app下载地址

.env文件语法

通过加上前缀添加评论#:

1 2 3
#数据库证书根DB_PASS DB_USER = =#这是密码

通过加前缀变量使用环境变量值美元:

1 2
DB_USER根DB_PASS = =美元{DB_USER}通过#包括用户密码前缀

谨慎

顺序很重要当一些env var取决于其他env增值的价值。在上面的例子中,DB_PASS必须定义之后DB_USER。此外,如果你定义多个.env文件和把DB_PASS首先,它的价值将取决于DB_USER其他文件中定义的值,而不是在这个文件中定义的值。

定义一个默认值,以防环境变量没有设置:

1 2
DB_USER = DB_PASS =美元{DB_USER:根}通过在DB_PASS = rootpass #结果

通过嵌入命令$ ()(不支持Windows上):

1
START_TIME = $(日期)

谨慎

使用$ ()根据您的shell可能无法正常工作。

提示

作为一个.env文件是一个普通的shell脚本,你可以它在自己的shell脚本:

1
美元.env

通过.env.local压倒一切的环境价值观

如果你需要覆盖一个环境值(例如本地机器上一个不同的值),你可以做的.env.local文件:

1 2
# .env.localDATABASE_URL =“mysql: / /根:@127.0.0.1:3306 / my_database_name”

这个文件应该被git,应该忽略致力于您的存储库。其他几个.env文件可以设置环境变量只是正确的情况:

  • .env:定义默认值的env var所需的应用程序;
  • .env.local:覆盖默认值适用于所有环境只包含文件的机器上。这个文件不应该致力于存储库的忽视测试环境(因为测试应该对每个人都产生相同的结果);
  • .env。<环境>(如。.env.test):覆盖env var仅为一个环境中,但是对于所有机器(这些文件提交);
  • .env。<环境>。local(如。.env.test.local):定义的特定机器的env var只覆盖一个环境。这是类似于.env.local,但覆盖只适用于一个环境。

真正的环境变量总是战胜env vars创建的任何.env文件。

.env.env。<环境>文件应该提交到存储库,因为他们都是相同的所有开发人员和机器。然而,env文件结束。local(.env.local.env。<环境>。local)不应该犯因为只有你会使用它们。事实上,.gitignoreSymfony可以防止它们被提到的文件提交欧宝娱乐app下载地址。

在生产中配置环境变量

在生产中,.env文件也对每个请求解析和加载。所以最简单的方法定义env var是通过创建一个.env.local在生产服务器上文件和你的产品价值(s)。

为了提高性能,您可以运行dump-env命令(在欧宝娱乐app下载地址Symfony Flex1.2或更高版本):

1 2
#解析所有.env文件和转储.env.local.php最终值美元作曲家dump-env刺激

在运行了这个命令之后,Symfony会加载欧宝娱乐app下载地址.env.local.php文件的环境变量,不会花时间解析.env文件。

提示

更新您的部署工具/工作流运行dump-env命令在每次部署提高应用程序的性能。

加密环境变量(秘密)

而不是定义或添加到一个真正的环境变量.env文件,如果一个变量的值是敏感(例如一个API键或数据库密码),你可以使用加密值秘密管理系统

清单环境变量

使用调试:dotenv命令来了解Symfony解析不同欧宝娱乐app下载地址.env文件设置每个环境变量的值:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
美元php bin /控制台调试:dotenv dotenv变量和文件= = = = = = = = = = = = = = = = = = = = = = = =扫描文件(下优先级)- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *⨯.env.local。php *⨯.env.dev.local *✓.env.dev *⨯.env。当地*✓.env变量- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -变量值.env.dev .env - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - n / FOO酒吧酒吧爱丽丝鲍勃鲍勃鲍勃- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

5.4

调试:dotenv命令是在Symfony 5.4中引入的。欧宝娱乐app下载地址

另外,不管你如何设置环境变量,你可以看到所有环境变量,与他们的价值观,Symfony中引用的容器配置:欧宝娱乐app下载地址

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元php bin /控制台调试:容器——env-vars - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -名字默认值实际价值- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - APP_SECRET n / a“471 a62e2d601a8952deb186e44186cb3”喷火“1”,2.5”,3]”n /酒吧空n / a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#你也可以过滤的列表env var的名字:美元php bin /控制台调试:容器——env-vars foo#运行这个命令显示所有的细节为特定env var:美元php bin /控制台调试:容器——env-var = FOO

访问配置参数

控制器和服务可以访问所有的配置参数。这包括参数定义自己和参数由包/包。运行以下命令来查看所有的参数存在于您的应用程序:

1
美元php bin /控制台调试:容器——参数

在控制器的扩展AbstractController,可以使用getParameter ()助手:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /控制器/ UserController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;用户控件扩展AbstractController{/ /……公共函数指数():响应{美元管理扫描=美元- >getParameter (“kernel.project_dir”);美元adminEmail=美元- >getParameter (“app.admin_email”);/ /……}}

在服务和控制器不从AbstractController注入参数作为参数的构造函数。您必须显式地将它们因为服务自动装配不工作参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml参数:app.contents_dir:“……”服务:应用程序服务\ \ MessageGenerator:参数:$ contentsDir:“% app.contents_dir %”

如果你一遍又一遍地注入相同的参数,使用services._defaults.bind选项。这个选项中定义的参数自动注射时服务构造函数或控制器动作定义具有相同名称的一个论点。例如,注入的价值内核。project_dir参数每当一个定义了一个服务/控制器美元管理扫描参数,用这个:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
#配置/ services.yaml服务:_defaults:绑定:#将该值传递给任何理由任何服务管理扫描过的美元#中创建这个文件(包括控制器参数)美元管理扫描:“% kernel.project_dir %”#……

另请参阅

读过一篇关于绑定参数的名称和/或类型了解更多关于这个强大的特性。

最后,如果一些服务需要访问大量的参数,而不是单独地注入每一个,你可以一次将所有应用程序参数,通过类型提示任何构造函数参数ContainerBagInterface:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /服务/ MessageGenerator.php名称空间应用程序\服务;/ /……使用欧宝娱乐app下载地址\组件\DependencyInjection\ParameterBag\ContainerBagInterface;MessageGenerator{私人美元参数个数;公共函数__construct(ContainerBagInterface美元参数个数){美元- >params =美元参数个数;}公共函数someMethod(){/ /得到任何容器从$ this - >参数,参数存储所有的他们美元发送方=美元- >参数个数- >get (“mailer_sender”);/ /……}}

使用PHP ConfigBuilders

5.3

“ConfigBuilders”特性是在Symfony 5.3中引入的。欧宝娱乐app下载地址

编写PHP配置有时是困难的,因为你得到大嵌套数组和你没有自动完成帮助从你最喜欢的IDE。一个解决这个问题的方法是使用“ConfigBuilders”。他们将帮助您构建这些数组的对象。

欧宝娱乐app下载地址Symfony的自动生成ConfigBuilder类内核构建目录所有的包安装在您的应用程序。按照惯例,他们都住在名称空间中欧宝娱乐app下载地址Symfony \配置:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /配置/包/ security.php使用欧宝娱乐app下载地址\配置\SecurityConfig;返回静态函数(SecurityConfig美元安全){美元安全- >防火墙(“主要”)- >模式(“^ / *”)- >懒惰(真正的)- >匿名();美元安全- >roleHierarchy (“ROLE_ADMIN”,(“ROLE_USER”])- >roleHierarchy (“ROLE_SUPER_ADMIN”,(“ROLE_ADMIN”,“ROLE_ALLOWED_TO_SWITCH”])- >accessControl ()- >路径(“^ /用户”)- >角色(“ROLE_USER”);美元安全- >accessControl ([“路径”= >“^ /管理”,“角色”= >“ROLE_ADMIN”]);};

请注意

只有根类的名称空间欧宝娱乐app下载地址Symfony \配置ConfigBuilders。嵌套的配置(如。\欧宝娱乐app下载地址 Symfony\配置\框架\ CacheConfig)是常规PHP对象不是autowired当使用他们作为参数类型。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist