86

コントローラーから、アプリケーション パラメーター ( 内のパラメーター) に次のようにアクセスします/app/config

$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%

または似たようなものですか?サービスからアプリケーション パラメータにアクセスするにはどうすればよいですか?


この質問は同じように見えますが、私の実際の回答 (コントローラーからのパラメーター) です。サービスからのアクセスについて話しているのです。

4

9 に答える 9

132

サービス定義でパラメーターを指定することにより、他のサービスを注入するのと同じ方法でパラメーターをサービスに渡すことができます。たとえば、YAML では次のようになります。

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

%my_param1%etc は という名前のパラメータに対応しますmy_param1。次に、サービス クラス コンストラクターは次のようになります。

public function __construct($myParam1, $myParam2)
{
    // ...
}
于 2012-06-26T16:17:07.697 に答える
21

必要なパラメーターを 1 つずつマッピングする代わりに、サービスがコンテナーに直接アクセスできるようにしないのはなぜですか? そうすることで、(サービスに関連する) 新しいパラメーターが追加された場合に、マッピングを更新する必要がなくなります。

そうするために:

サービスクラスに次の変更を加えます

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
于 2015-09-07T09:16:32.137 に答える
6

言及されたいくつかの問題の解決策として、配列パラメーターを定義してから挿入します。後で新しいパラメータを追加するには、service_container の引数や構造を変更せずに、パラメータ配列に追加するだけで済みます。

したがって、@richsageの回答を拡張します。

parameters.yml

parameters:
    array_param_name:
        param_name_1:   "value"
        param_name_2:   "value"

services.yml

services:
    my_service:
        class:  My\Bundle\Service\MyService
        arguments: [%array_param_name%]

次に、クラス内にアクセスします

public function __construct($params)
{
    $this->param1 = array_key_exists('param_name_1',$params)
        ? $params['param_name_1'] : null;
    // ...
}
于 2016-11-16T19:51:07.010 に答える
-2

symfony 4 では、依存性注入によってパラメーターにアクセスできます。

サービス:

   use Symfony\Component\DependencyInjection\ContainerInterface as Container;

   MyServices {

         protected $container;
         protected $path;

         public function __construct(Container $container)
         {
             $this->container = $container;
             $this->path = $this->container->getParameter('upload_directory');
         }
    }

parameters.yml:

parameters:
     upload_directory: '%kernel.project_dir%/public/uploads'
于 2019-05-22T00:27:08.357 に答える