本文概述
在较旧版本的Symfony中, 我们曾经在config.yml文件中定义在部署计算机上没有更改的参数:
# app/config/config.yml
# ...
parameters:
locale: en
framework:
# ...
# any string surrounded by two % is replaced by that parameter value
default_locale: "%locale%"
# ...
但是, 在Symfony 4中, 可以在此处使用的许多变量移到了env文件中, 或者在services.yaml文件中的部署机器上未更改的那些变量。对于使用此版本框架的许多新开发人员而言, 通常不清楚如何在项目中最常见的位置(如Controllers and Services)中检索这些参数。
在这篇简短的文章中, 我们将向你解释如何轻松地从控制器和服务内部检索那些参数。
1.确保启用了自动装配并且你有一些参数
为了使用从services.yaml文件中检索参数的默认方式, 你需要确保在项目中启用了autowire和autoconfigure属性, 你可以检查是否在你所在的同一services.yaml文件中启用了该属性。可以为你的服务定义参数:
# app/config/services.yaml
# Some retrievable parameters
parameters:
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并将其作为参数捕获到控制器的方法中, 在该方法中你需要获取以下示例中公开的一些参数:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
// 1. Include the ParameterBagInterface class
use 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注入需要的每个方法, 而是需要将其存储在类中变量并在构造函数中更新其值:
<?php
namespace 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()
}
}
编码愉快!
评论前必须登录!
注册