本文概述
将项目从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"));
}
}
编码愉快!
评论前必须登录!
注册