26

そのサービスをトラブルシューティングするために、別のサービスでロギングサービスを使用しようとしています。

私のconfig.ymlは次のようになります:

services:
    userbundle_service:
        class:        Main\UserBundle\Controller\UserBundleService
        arguments: [@security.context]

    log_handler:
        class: %monolog.handler.stream.class%
        arguments: [ %kernel.logs_dir%/%kernel.environment%.jini.log ]


    logger:
        class: %monolog.logger.class%
        arguments: [ jini ]
        calls: [ [pushHandler, [@log_handler]] ]

これはコントローラーなどでは問題なく動作しますが、他のサービスで使用すると出力されません。

任意のヒント?

4

3 に答える 3

35

サービスIDを引数としてサービスのコンストラクターまたはセッターに渡します。

userbundle_serviceあなたの他のサービスが:であると仮定します

userbundle_service:
    class:        Main\UserBundle\Controller\UserBundleService
    arguments: [@security.context, @logger]

UserBundleServiceこれで、ロガーが適切に更新されれば、ロガーがコンストラクターに渡されます。eG

protected $securityContext;
protected $logger;

public function __construct(SecurityContextInterface $securityContext, Logger $logger)
{
    $this->securityContext = $securityContext;
    $this->logger = $logger;
}
于 2012-08-03T18:50:33.783 に答える
11

Symfony 3.3、4.x、5.x以降の場合、最も簡単な解決策は依存性注入を使用することです。

サービスを別のサービスに直接注入できます(たとえばMainService

// AppBundle/Services/MainService.php
// 'serviceName' is the service we want to inject
public function __construct(\AppBundle\Services\serviceName $injectedService)  {
    $this->injectedService = $injectedService;
}

次に、MainServiceの任意のメソッドで注入されたサービスを次のように使用します。

// AppBundle/Services/MainService.php
public function mainServiceMethod() {
    $this->injectedService->doSomething();
}

そしてビオラ!インジェクションサービスのどの機能にもアクセスできます!

自動配線が存在しない古いバージョンのSymfonyの場合-

// services.yml
services:
    \AppBundle\Services\MainService:
        arguments: ['@injectedService']
于 2017-08-30T12:07:31.240 に答える
0

より用途の広いオプションは、注入したいクラスの特性を一度作成することです。例えば:

Traits / SomeServiceTrait.php

Trait SomeServiceTrait
{
    protected SomeService $someService;

    /**
     * @param SomeService $someService
     * @required
     */
    public function setSomeService(SomeService $someService): void
    {
        $this->someService = $someService;
    }
}

そして、あなたがいくつかのサービスを必要とするところ:

class AnyClassThatNeedsSomeService
{
    use SomeServiceTrait;

    public function getSomethingFromSomeService()
    {
        return $this->someService->something();
    }
}

@requiredアノテーションにより、クラスは自動ロードされます。これにより、一般に、サービスを多数のクラス(イベントハンドラーなど)に注入する場合の実装がはるかに高速になります。

于 2021-11-08T14:08:18.707 に答える