如何在Symfony 4中使用服务检索项目的根目录和其他容器参数

本文概述

  • 1.创建助手类
  • 2.注册服务
  • 3.例子
将项目从Symfony 3升级到Symfony 4之后, 我发现从config.yml或parameters.yml中获取参数就像在Symfony 4中一样不直观。在新版本中, 参数在服务中处理。 yaml文件或项目的.env文件中。通常, 你可以接受, 只需将新参数写入env文件, 然后使用PHP的getenv函数检索它们即可。但是, 由于扩展了AbstractController类而不是经典Controller的控制器内的容器不可用, 因此在旧代码中引发了许多异常。这迫使我研究一种使用框架检索项目根目录的方法, 在这里我与你分享结果。
在本文中, 我将向你介绍如何检索Symfony 4项目的根目录路径以及服务容器中可用的其他参数。
1.创建助手类我们将通过将注册为服务的帮助程序来检索容器接口的参数。 helper类如下, 在/ yourapp / src / Service目录中创建ContainerParametersHelper.php文件, 内容如下:
< ?php// app/src/Service/ContainerParametersHelper.phpnamespace App\Service; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class ContainerParametersHelper {private $params; public function __construct(ParameterBagInterface $params){$this-> params = $params; }/*** This method returns the root directory of your Symfony 4 project.* * e.g "/var/www/vhosts/myapplication"* * @return type*/public function getApplicationRootDir(){return $this-> params-> get('kernel.project_dir'); }/*** This method returns the value of the defined parameter.* * @return type*/public function getParameter($parameterName){return $this-> params-> get($parameterName); }}

2.注册服务如果你在项目中启用了自动装配功能(在新的symfony Web项目中默认启用), 仅在指定目录中创建文件就足够了, 你可以跳过此步骤。你可以验证项目是否启用了自动装配功能, 打开项目的services.yaml文件并检查autowire和autoconfigure选项是否设置为true:
# app/config/services.yamlservices:# 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.

如果看起来像这样, 就可以开始了(转到步骤3)。如果不是, 请手动注册服务。
3.例子现在, 为了帮助你了解通过依赖注入注册了此帮助程序类的简单程度, 我们提供了两个基本示例:
如何获取根目录
如我们的助手类ContainerParametersHelper所述, 我们已经创建了一个返回目录的方法, 因此我们只需要在需要的地方注入该类即可。在此示例中, 我们将在某个控制器中需要此类, 并将打印此方法检索的根目录的路径作为响应:
< ?phpnamespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use App\Service\ContainerParametersHelper; class UserController extends AbstractController{public function index(ContainerParametersHelper $pathHelpers){// Renders in the browser an empty html page with an output like:// /var/www/vhosts/myprojectdirectoryreturn new Response($pathHelpers-> getApplicationRootDir()); } }

如何检索其他容器参数
当我们使用参数袋时, 你将能够检索在项目的services.yaml文件中定义的参数:
# This file is the entry point to configure your own services.# Files in the packages/ subdirectory configure your dependencies.# Put parameters here that don't need to change on each machine where the app is deployed# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration# /app/config/services.yamlparameters:locale: 'en'

如先前的服务文件中所示, 我们已经定义了语言环境参数, 因此我们可以像这样从服务中检索它:
< ?phpnamespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use App\Service\ContainerParametersHelper; class UserController extends AbstractController{public function index(ContainerParametersHelper $pathHelpers){// Renders in the browser an empty html page with an output like:// "en"return new Response($pathHelpers-> getParameter("en")); } }

【如何在Symfony 4中使用服务检索项目的根目录和其他容器参数】编码愉快!

    推荐阅读