如何在Symfony 4中从services.yaml检索特定和所有YAML参数

本文概述

  • 1.确保启用了自动装配并且你有一些参数
  • 2.在控制器内获取参数
  • 3.在服务中获取参数
【如何在Symfony 4中从services.yaml检索特定和所有YAML参数】在较旧版本的Symfony中, 我们曾经在config.yml文件中定义在部署计算机上没有更改的参数:
# app/config/config.yml# ...parameters:locale: enframework:# ...# any string surrounded by two % is replaced by that parameter valuedefault_locale:"%locale%"# ...

但是, 在Symfony 4中, 可以在此处使用的许多变量移到了env文件中, 或者在services.yaml文件中的部署机器上未更改的那些变量。对于使用此版本框架的许多新开发人员而言, 通常不清楚如何在项目中最常见的位置(如Controllers and Services)中检索这些参数。
在这篇简短的文章中, 我们将向你解释如何轻松地从控制器和服务内部检索那些参数。
1.确保启用了自动装配并且你有一些参数为了使用从services.yaml文件中检索参数的默认方式, 你需要确保在项目中启用了autowire和autoconfigure属性, 你可以检查是否在你所在的同一services.yaml文件中启用了该属性。可以为你的服务定义参数:
# app/config/services.yaml# Some retrievable parametersparameters:uploads_directory: '%kernel.project_dir%/public/uploads'download_directory: '%kernel.project_dir%/public/downloads'services:# default configuration for services in *this* file_defaults:autowire: true# Automatically injects dependencies in your services.autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

知道已启用这些属性, 并且你需要从服务或控制器获取一些X参数, 就可以继续执行下一步了。
2.在控制器内获取参数从控制器内部, 你将能够获取参数, 并自动注入ParameterBagInterface, 该实用程序由管理服务容器参数的对象实现。你可以简单地包括ParameterBagInterface并将其作为参数捕获到控制器的方法中, 在该方法中你需要获取以下示例中公开的一些参数:
< ?phpnamespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; // 1. Include the ParameterBagInterface classuse Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; // 2. Basically what we do is autoinject the ParameterBagInterface as argument//inside the method where you need to obtain a parameter from the services.yaml file//and then, using the get method you can retrieve a specific parameter.class MyController extends AbstractController{public function upload(Request $request, ParameterBagInterface $params): Response{// $uploadsDirectory contains:///var/www/vhosts/app/public/uploads$uploadsDirectory = $params-> get('uploads_directory'); // ... or retrieve them all with $params-> all()}public function download(Request $request, ParameterBagInterface $params): Response{// $uploadsDirectory contains:///var/www/vhosts/app/public/downloads$downloadsDirectory = $params-> get('downloads_directory'); // ... or retrieve them all with $params-> all()}}

3.在服务中获取参数如果你需要从自己的服务内部获取参数而不是控制器, 则可以继续执行上述逻辑, 但是无需将ParameterBagInterface注入需要的每个方法, 而是需要将其存储在类中变量并在构造函数中更新其值:
< ?phpnamespace App\Controller; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class MyService{private $params; public function __construct(ParameterBagInterface $params){$this-> params = $params; }public function someMethod(){// $uploadsDirectory contains:///var/www/vhosts/app/public/uploads$uploadsDirectory = $params-> get('uploads_directory'); // ... or retrieve them all with $params-> all()}}

编码愉快!

    推荐阅读