Symfony的配置欧宝娱乐app下载地址
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
Symfony的配置欧宝娱乐app下载地址
配置文件
欧宝娱乐app下载地址配置Symfony应用程序时使用存储在配置/
目录,默认结构如下:
1 2 3 4 5 6 7
Your-project /├─config/│├─packages/│├─bundles.php│├─routes。│├─服务。Yaml├─…
的routes.yaml
文件定义路由配置;的services.yaml
文件配置服务容器;的bundles.php
文件启用/禁用应用程序中的包。
你将在配置/包/
目录中。此目录存储应用程序中安装的每个包的配置。包(在Symfony中也称为“包”,在其他项目中称为“插件/模块”)为欧宝娱乐app下载地址您的项目添加了现成的特性。
当使用欧宝娱乐app下载地址Symfony Flex,在Symfony应用程序中默认启用,包更新欧宝娱乐app下载地址bundles.php
文件和创建新的文件配置/包/
在安装过程中自动执行。例如,这是由"API Platform"包创建的默认文件:
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文档中,所有配置示例都将以这三种格式显示。欧宝体育电话
格式之间没有任何实际区别。事实上,在运行应用欧宝娱乐app下载地址程序之前,Symfony会将它们全部转换并缓存到PHP中,因此它们之间甚至没有任何性能差异。
在安装包时默认使用YAML,因为它简洁易读。以下是每种格式的主要优点和缺点:
配置参数
有时在几个配置文件中使用相同的配置值。您可以将其定义为一个“参数”,而不是重复它,这就像一个可重用的配置值。根据约定,参数定义在参数
输入配置/ services.yaml
文件:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
#配置/ services.yaml参数:#参数名是一个任意字符串(推荐使用'app.'前缀)#以更好地区分您的参数与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&bar=%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下载地址配置环境.
典型的Symfony欧宝娱乐app下载地址应用程序从三个环境开始:dev
(供本地发展),刺激
(用于生产服务器)和测验
(自动化测试).当运行应用程序时,Symfony按以下顺序加载配置文件(最后欧宝娱乐app下载地址一个文件可以覆盖前面设置的值):
/ * .yaml配置/包
(和* . xml
而且*。php
文件);配置/包/ < environment-name > / * .yaml
(和* . xml
而且*。php
文件);配置/包/ services.yaml
(和services . xml
而且services.php
文件);
取框架
包,以默认安装为例:
- 首先,
配置/包/ framework.yaml
在所有环境中加载,它配置框架与一些选项; - 在刺激环境,没有额外的设置,因为没有
配置/包/刺激/ framework.yaml
文件; - 在dev环境,也没有文件(
配置/包/ dev / framework.yaml
不存在)。 - 在测验环境中,
配置/包/测试/ framework.yaml
中配置的一些设置配置/包/ framework.yaml
.
实际上,每个环境只是与其他环境略有不同。这意味着所有环境共享大量公共配置,这些配置直接放在文件中配置/包/
目录中。
另请参阅
看到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 bin/console命令名#忽略.env文件,在生产环境中运行此命令$APP_ENV=prod php bin/console command_name .使用实例
创造新环境
Symfony提供的默认三个环境对于大多数项目来说已经足够了,但是您也可以定义自己的环欧宝娱乐app下载地址境。例如,这就是如何定义暂存
客户端在进入生产环境之前可以测试项目的环境:
- 创建一个与环境同名的配置目录(在本例中,
配置/包/分期/
); - 添加所需的配置文件
配置/包/分期/
定义新环境的行为。欧宝娱乐app下载地址Symfony首先加载文件/ * .yaml配置/包
,因此您必须只配置与这些文件的差异; - 选择
暂存
环境使用APP_ENV
如前一节所述。
提示
环境之间相互相似是很常见的,因此您可以使用符号链接之间的配置/包/ < environment-name > /
目录来重用相同的配置。
基于环境变量的配置
使用环境变量(或简称“env vars”)是一种常见的做法,用于配置依赖于应用程序运行位置的选项(例如,在生产环境和本地机器中,数据库凭据通常是不同的)。
您可以将它们定义为环境变量,并使用特殊的语法在配置文件中引用它们,而不是将它们定义为常规选项% env (ENV_VAR_NAME) %
.这些选项的值在运行时解析(为了不影响性能,每个请求只解析一次)。
下面的例子展示了如何使用env变量配置数据库连接:
- YAML
- XML
- PHP
1 2 3 4 5 6
#配置/包/ doctrine.yaml原则:dbal:按照惯例,env变量的名称总是大写的url:' % env (DATABASE_URL) %#……
下一步是在shell、web服务器等中定义这些env变量的值。下面的部分将对此进行解释,但是为了保护应用程序不受未定义的env变量的影响,可以使用.env
文件:
1 2
# .envDATABASE_URL = sqlite: / / / % kernel.project_dir % / var / data.db
另请参阅
env vars的值只能是字符串,但Symfony包含了一些欧宝娱乐app下载地址环境变量处理器转换它们的内容(例如,将字符串值转换为整数)。
为了定义env vars的实际值,Symfony提出了不同的解决方案,具体取决于应用程序是运行在生产欧宝娱乐app下载地址环境中还是运行在本地开发机器中。
与设置环境变量的方式无关,您可能需要运行调试:容器
命令使用——env-vars
选项,以验证它们是否已定义并具有预期值:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
$php bin /控制台调试:容器——env-vars ---------------- ----------------- --------------------------------------------- 名字默认值实际价值 ---------------- ----------------- --------------------------------------------- APP_SECRET n /一个“471 a62e2d601a8952deb186e44186cb3”喷火“1”,2.5”,3]”零n / n /酒吧 ---------------- ----------------- ---------------------------------------------#你也可以通过名称过滤env变量列表:$PHP bin/控制台调试:容器——env-vars foo#运行这个命令来显示特定的env变量的所有细节:$php bin/console debug:container——env-var=FOO
4.3
调试环境变量的选项是在Symfony 4.3中引入的。欧宝娱乐app下载地址
在开发中配置环境变量
Symfony没有在shell或web服务器中定义env变量,而是提出了一种方便的方法,可以在本地机器中基于一个名为欧宝娱乐app下载地址.env
(前导点)位于项目的根。
的.env
文件在每个请求时都被读取和解析,并且它的env变量被添加到_ENV美元
PHP变量。中定义的值永远不会覆盖现有的env变量.env
,所以你可以结合两者。
这是举例来说的内容.env
属性的值DATABASE_URL
本文前面所示的Env var:
1 2
# .envDATABASE_URL =“mysql: / / db_user: db_password@127.0.0.1:3306 / db_name”
除了你自己的环境,这个.env
文件还包含由安装在应用程序中的第三方包定义的env vars(它们由欧宝娱乐app下载地址Symfony Flex安装包时)。
配置生产环境变量
在生产中,.env
文件也会在每个请求上被解析和加载,因此您可以将env vars添加到服务器中已经定义的文件中。为了提高性能,可以运行dump-env
命令(使用时可用欧宝娱乐app下载地址Symfony Flex1.2或更高版本)。
该命令解析所有.env
文件,并将它们的内容编译到一个新的php优化文件.env.local.php
.从那时起,Symfony将加载已解析欧宝娱乐app下载地址的文件,而不是解析.env
文件:
1
$作曲家dump-env prod
提示
更新部署工具/工作流以运行dump-env
命令,以提高应用程序的性能。
创建.env
files是在Symfony应用程序中使用env vars的最简单方法。欧宝娱乐app下载地址但是,您也可以在服务器和操作系统中配置真实的环境变量。
提示
欧宝娱乐app欧宝体育应用最新版app下载下载地址SymfonyCloud是为Symfony应用程序优化的云服务,它定义了一些管理环境变量的实用程序在生产中。
谨慎
小心倾倒的内容$ _SERVER
而且_ENV美元
变量或输出phpinfo ()
内容将显示环境变量的值,暴露敏感信息,如数据库凭据。
的web界面中也会显示env变量的值欧宝娱乐app下载地址Symfony分析器.实际上,这应该不是问题,因为web分析器必须这样做从来没有在生产环境中启用。
管理多个。env文件
的.env
文件定义了所有env变量的默认值。然而,根据环境(例如使用不同的数据库进行测试)或机器(例如在开发时在本地机器上使用不同的OAuth令牌),覆盖其中一些值是很常见的。
这就是为什么你可以定义倍数.env
覆盖env变量的文件。下面的列表显示了所有环境中加载的文件。的.env
File是唯一的强制文件,每个文件的内容都覆盖前一个文件:
.env
:定义应用程序所需的env变量的默认值;.env.local
:覆盖所有环境的env vars的默认值,但只在包含该文件的机器中(例如,开发计算机)。该文件不应提交到存储库,并且在测验
环境(因为测试应该对每个人产生相同的结果);.env。<环境>
(如。.env.test
):覆盖env vars只对某些环境,但对所有机器;.env。<环境>。local
(如。.env.test.local
):仅为某些环境定义特定于机器的env vars重写。它类似于.env.local
,但覆盖只适用于某些特定的环境。
请注意
类创建的环境变量总是优于服务器中定义的实际环境变量.env
文件。
的.env
而且.env。<环境>
文件应该提交到共享存储库,因为它们对于所有开发人员和机器都是相同的。但是,env文件以。local
(.env.local
而且.env。<环境>。local
)不应该承诺因为只有你会用到它们。事实上,.gitignore
Symfony附带的文件可以阻止它们被提交欧宝娱乐app下载地址。
谨慎
2018年11月之前创建的应用程序的系统略有不同,涉及一个.env.dist
文件。有关升级的信息,请参见:2018年11月更改为.env及如何更新.
访问配置参数
控制器和服务可以访问所有的配置参数。这包括自定义参数以及由包/包创建的参数。运行以下命令查看应用程序中存在的所有参数:
1
$PHP bin/console调试:container——parameters
控件扩展的控制器中AbstractController,使用getParameter ()
助手:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /控制器/ UserController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;类用户控件扩展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:绑定:#将此值传递给任何服务的任何$projectDir参数在这个文件中创建的#(包括控制器参数)美元管理扫描:“% kernel.project_dir %”#……
另请参阅
阅读这篇关于通过名称和/或类型绑定参数要了解有关此强大功能的更多信息。
最后,如果某个服务需要访问大量参数,您可以一次性注入所有应用程序参数,而不是逐个注入它们ContainerBagInterface:
12 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->params获取任何容器参数,存储所有容器参数$发送方=$这->参数个数->get (“mailer_sender”);/ /……}}