【问题标题】:How do I read from parameters.yml in a controller in symfony2?如何从 symfony2 的控制器中读取 parameters.yml?
【发布时间】:2012-12-03 18:53:33
【问题描述】:

我在 app/config/parameters.yml 中放置了几个自定义变量。

parameters:
    api_pass: apipass
    api_user: apiuser

我需要从我的控制器访问这些,并尝试使用

$this->get('api_user');

从我的控制器文件中。当我尝试这个时,我收到以下错误消息:

You have requested a non-existent service "api_user".

这样做的正确方法是什么?

【问题讨论】:

    标签: symfony symfony-2.3


    【解决方案1】:

    Symfony 2.6 和更早的版本中,要在控制器中获取参数 - 您应该首先获取容器,然后 - 所需的参数。

    $this->container->getParameter('api_user');
    

    documentation chapter 解释了它。

    而控制器中的 $this->get() 方法将加载服务 (doc)

    Symfony 2.7 和更新版本中,要在控制器中获取参数,您可以使用以下命令:

    $this->getParameter('api_user');
    

    【讨论】:

    • 请注意,控制器中的get方法也使用了容器,但它只能从容器中获取服务,不能获取参数。获取参数需要getParameter
    • 当我尝试$this->getContainer()->getParameter('api_user'); 时出现致命错误:调用未定义的方法..Longpath..\Controller::getContainer()。
    • @Bohr 抱歉,Symfony2 的不同版本。我已经编辑了我的答案 - 现在检查;)
    • Symfony 2.7 和更新版本:$this->hasParameter() 还没有工作。
    【解决方案2】:

    清洁方式 - 2018+,Symfony 3.4+

    自 2017 年以来,Symfony 3.3 + 3.4 有了更简洁的方式 - 易于设置和使用。

    您可以通过类的构造函数将参数传递给类,而不是使用容器和服务/参数定位器反模式。别担心,这不是耗时的工作,而是设置一次后忘记的方法。

    如何分两步设置?

    1。 app/config/services.yml

    # config.yml
    
    # config.yml
    parameters:
        api_pass: 'secret_password'
        api_user: 'my_name'
    
    services:
        _defaults:
            autowire: true
            bind:
                $apiPass: '%api_pass%'
                $apiUser: '%api_user%'
    
        App\:
            resource: ..
    

    2。任何Controller

    <?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"
        }
    }
    

    即时升级就绪!

    如果您使用较旧的方法,您可以automate it with Rector

    了解更多

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

    要了解更多信息,请查看我的帖子How to Get Parameter in Symfony Controller the Clean Way

    (它已经过测试,我会为新的 Symfony 主要版本(5、6...)进行更新。

    【讨论】:

    【解决方案3】:

    我给你发一个 swiftmailer 的例子:

    parameters.yml

    recipients: [email1, email2, email3]
    

    服务:

    your_service_name:
            class: your_namespace
            arguments: ["%recipients%"]
    

    服务的类别:

    protected $recipients;
    
    public function __construct($recipients)
    {
        $this->recipients = $recipients;
    }
    

    【讨论】:

      【解决方案4】:

      在 Symfony 4 中,您可以使用ParameterBagInterface

      use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
      
      class MessageGenerator
      {
          private $params;
      
          public function __construct(ParameterBagInterface $params)
          {
              $this->params = $params;
          }
      
          public function someMethod()
          {
              $parameterValue = $this->params->get('parameter_name');
              // ...
          }
      }
      

      app/config/services.yaml:

      parameters:
          locale: 'en'
          dir: '%kernel.project_dir%'
      

      它适用于控制器和表单类。 More details can be found in the Symfony blog.

      【讨论】:

      • 传递整个参数包就像传递整个容器。仅在“如果某些特定服务需要大量容器参数时”才有意义(引自帖子)
      • 那么,您的意思是传递整个参数会导致性能问题吗?
      • 这是原因之一,但主要是为了可读性。如果我看到参数名称$meetupApiKey,我知道会比$parameterBag 更好地期待什么
      【解决方案5】:

      你可以使用:

      public function indexAction()
      {
         dump( $this->getParameter('api_user'));
      }
      

      有关更多信息,我建议您阅读文档:

      http://symfony.com/doc/2.8/service_container/parameters.html

      【讨论】:

        【解决方案6】:

        在 Symfony 5 中,当您的 Controller 扩展 AbstractController 时,您可以使用:

        $projectDir = $this->getParameter('kernel.project_dir');
        

        更多信息请见https://symfony.com/doc/current/configuration.html#accessing-configuration-parameters

        【讨论】:

          【解决方案7】:

          在 Symfony 4.3.1 中我使用这个:

          services.yaml

          HTTP_USERNAME: 'admin'
          HTTP_PASSWORD: 'password123'
          

          FrontController.php

          $username = $this->container->getParameter('HTTP_USERNAME');
          $password = $this->container->getParameter('HTTP_PASSWORD');
          

          【讨论】:

          • 在 4.8 中不起作用。你确定有一天它会奏效吗?
          • 我真的忘记了这一点,但是它可能有效,因为我只发布了经过测试的东西!
          • 对不起,阿哈拉夫。我不知道,但没有在我的控制器中工作。在您的控制器内部,您可以直接调用 getParameter,无需 DI。即:$this-&gt;getParameter('foo')。这就是我在 SF 4.8 中所做的工作。
          【解决方案8】:

          你也可以使用:

          $container->getParameter('api_user');
          

          访问http://symfony.com/doc/current/service_container/parameters.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-14
            • 1970-01-01
            • 1970-01-01
            • 2013-03-02
            • 2015-02-07
            • 2013-12-11
            • 2012-02-17
            • 1970-01-01
            相关资源
            最近更新 更多