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

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

本文概述

在较旧版本的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()
    }
}

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 4中从services.yaml检索特定和所有YAML参数

评论 抢沙发

评论前必须登录!