个性化阅读
专注于IT技术分析

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

本文概述

将项目从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.php

namespace 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.yaml
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.

如果看起来像这样, 就可以开始了(转到步骤3)。如果不是, 请手动注册服务。

3.例子

现在, 为了帮助你了解通过依赖注入注册了此帮助程序类的简单程度, 我们提供了两个基本示例:

如何获取根目录

如我们的助手类ContainerParametersHelper所述, 我们已经创建了一个返回目录的方法, 因此我们只需要在需要的地方注入该类即可。在此示例中, 我们将在某个控制器中需要此类, 并将打印此方法检索的根目录的路径作为响应:

<?php

namespace 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/myprojectdirectory
        return 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.yaml
parameters:
    locale: 'en'

如先前的服务文件中所示, 我们已经定义了语言环境参数, 因此我们可以像这样从服务中检索它:

<?php

namespace 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"));
    } 
}

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 4中使用服务检索项目的根目录和其他容器参数

评论 抢沙发

评论前必须登录!