当前位置: 首页 > 知识库问答 >
问题:

如何从服务访问应用程序参数?

瞿文柏
2023-03-14

从我的控制器中,我使用

$this->container->getParameter('my_param')

但是我不知道如何从服务中访问它(我想我的服务类不应该扩展Symfony\Bundle\FrameworkBundle\Controller\Controller)。

我是否应该像这样将所需的参数映射到我的服务注册中:

#src/Me/MyBundle/Service/my_service/service.yml
parameters:
    my_param1: %my_param1%
    my_param2: %my_param2%
    my_param3: %my_param3%

或者类似的东西?如何从服务访问应用程序参数?

这个问题看起来是一样的,但我实际上回答了它(控制器的参数),我说的是从服务访问。

共有3个答案

何晗昱
2023-03-14

与其逐个映射所需的参数,为什么不允许您的服务直接访问容器?这样,如果添加了新参数(与服务相关),则不必更新映射。

为此:

对服务类进行以下更改

use Symfony\Component\DependencyInjection\ContainerInterface; // <- Add this

class MyServiceClass
{
    private $container; // <- Add this
    public function __construct(ContainerInterface $container) // <- Add this
    {
        $this->container = $container;
    }
    public function doSomething()
    {
        $this->container->getParameter('param_name_1'); // <- Access your param
    }
}

在services.yml中添加@service_container作为"参数"

services:
  my_service_id:
    class: ...\MyServiceClass
    arguments: ["@service_container"]  // <- Add this
漆雕稳
2023-03-14

自2018年和Symfony 3.4以来,有更干净的方法——易于设置和使用。

您可以通过类的构造函数将参数传递给类,而不是使用容器和服务/参数定位器反模式。别担心,这不是费时费力的工作,而是一次安装

如何分两步进行设置?

# config.yml
parameters:
    api_pass: 'secret_password'
    api_user: 'my_name'

services:
    _defaults:
        autowire: true
        bind:
            $apiPass: '%api_pass%'
            $apiUser: '%api_user%'

    App\:
        resource: ..
<?php declare(strict_types=1);

final class ApiController extends SymfonyController
{
    /**
     * @var string 
     */
    private $apiPass;

    /**
     * @var string
     */
    private $apiUser;

    public function __construct(string $apiPass, string $apiUser)
    {
        $this->apiPass = $apiPass;
        $this->apiUser = $apiUser;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPass); // "secret_password"
        var_dump($this->apiUser); // "my_name"
    }
}

如果您使用旧的方法,您可以使用Rector自动执行。

这称为服务定位器上的构造函数注入方法。

要了解更多关于此的信息,请查看我的帖子如何在Symfony Controller中获取参数清洁方式。

(它经过测试,我会为新的Symfony主要版本(5,6…)不断更新它)。

岳嘉容
2023-03-14

通过在服务定义中指定参数,可以以与注入其他服务相同的方式将参数传递给服务。例如,在YAML中:

services:
    my_service:
        class:  My\Bundle\Service\MyService
        arguments: [%my_param1%, %my_param2%]

其中,%my_param1%等对应于名为my_param1的参数。然后,您的服务类构造函数可以是:

public function __construct($myParam1, $myParam2)
{
    // ...
}
 类似资料:
  • 我已经通过creat-react-app创建了一个前端应用程序。 命令“npm run start”可以创建一个webpack-dev-server,并为我的 前端应用程序提供开发服务。问题来了: 我的前端应用程序必须从我之前创建的节点服务器请求一些api。 默认情况下create-react-app在端口3000上启动webpack-dev-server 我的节点服务器在端口3001上启动 直接

  • 问题内容: 我需要在本地使用数据库。我已经使用Visual Studio 2012在(LocalDB)\ v11.0 Server中创建了数据库。从例如控制台应用程序进行连接时,一切正常。但是我的应用程序是Windows Service。尝试通过以下方式连接到我的数据库输出: 有什么解决办法吗?也许我应该考虑为此设置其他数据库服务器?如果是,如何设置它使其仅在本地可见? 问题答案: 所以我自己找到

  • 我是超级分类账的初学者。 我目前正在使用开发web服务/应用程序,调用hyperledger-fabric chaincode。例如,我想通过创建一个URL,该URL可能类似于,并且该URL将访问一个hyperledger-fabric链码,该链码可以查询名为abc的用户的资金。 提前谢了。任何帮助都将不胜感激。

  • 主要问题--这看起来像是一个基本的flyway问题,我可能(不知为什么)在我的研究中错过了这个问题,但是--当尝试使用flyway迁移数据时,是否可以访问applications services(spring配置的)?下面的一些细节- 其他详细信息- 我知道我们不能注入spring数据服务等(从这个SO问题中了解到)。我从数据访问的角度理解了这一点。 但是在使用flyway时,我们是否可以不使用

  • 我的问题很简单,也很直观,但几个星期都解决不了。 我在Windows8上使用Docker。(当然是Docker工具箱+VirtualBox)。我把图像推到Docker Hub并使用Kitematic部署R shiny应用程序。 上面的图片显示它正在运行,但我无法通过给定的Docker机器IP 192.168.99.100:32772访问它

  • 我可以在AppEngine应用程序中使用GAE托管的MongoDB吗? 如果是,如何用appengine实例调试此连接问题? 提前谢了。