2017-12-10 11 views
1

私はそれが働いたのログファイルに、この情報メッセージが表示されますが、ログファイルにこのメッセージを書くloggerサービスと呼ばれる:symfonyの3.4ロガーサービス

php.INFO:ユーザー非推奨:「ロガー」サービス があります非公開です。コンテナから取得することは、symfony 3.2以降では推奨されなくなり、4.0で失敗します。サービスをパブリックにするか、コンテナの直接使用をやめ、依存関係の注入 を代わりに使用する必要があります。 {「例外」:「[オブジェクト](ErrorException(コード:0):ユーザー 非推奨:\」。ロガー\」サービスがプライベートで、 コンテナからそれを得ることはsymfonyの3.2以降廃止されており、4.0に失敗します サービスを公開する、または直接の容器 の使用を停止し、代わりに、依存性注入を使用する必要がありますどちらか。 /自宅/ ****/###/PROJECT /ベンダー/ symfonyの/ symfonyの/ SRC/symfonyの/コンポーネント/依存性の注入/ Container.php:275) "} []

マイsymfonyのバージョン:ロガーは、のように(今であるため

+0

あなたのコードなし特にお手伝いできないものの、エラーメッセージが間違っていることを伝えています。 Symfonyサービスと依存性注入は、3.2と3.4の間で大幅に変化しました。https://symfony.com/doc/current/service_container/3.3-di-changes.html – MEmerson

+0

ああ、申し訳ありませんがコードで私はロガーサービスとコール情報メソッドを取得 –

+0

そうしないでください。ロガーをどこに引っ張っているのかを示す少しのコードで質問を更新することを検討してください。そしておそらく私たちは変化を提案することができます。 – Cerad

答えて

0

$this->container->get('logger') 3.4.1が失敗3.2)は、プライベートサービスとしてマークされているので、すべてのサービスはデフォルトでプライベートです。つまり、これらのサービスをコンテナから返すことができず、代わりに依存性を注入する必要があります。(クラスコンストラクタは、ロガーをパラメータとして使用し、アクセス可能なクラス)、またはサービスコンフィグレーションでpublicとしてマークされていて、ロガーはsymfonyコンポーネントなので、サービスコンフィグレーションはsymfonyプロジェクト内にあります。symfonyからプロジェクトサービスコンフィグレーションにロガー設定をコピーする必要がありますpublic: trueを追加して、コンテナからロガーインスタンスにアクセスします。

3

symfony 3.4で述べたように、MonologBundleと他のすべてのサービスによって提供されるloggerサービスは、デフォルトでプライベートに設定されています。問題を回避するには[sic]

、推奨される方法は、依存性の注入を使用することです。 http://symfony.com/doc/3.4/logging.html

namespace AppBundle/Controller; 

use Psr\Log\LoggerInterface; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    public function indexAction(LoggerInterface $logger) 
    { 
     $logger->info('Your Message'); 
    } 
} 

ソースコードのリファレンス:autowireが有効になっている場合に依存性の注入が可能ですhttps://github.com/symfony/monolog-bundle/blob/v3.1.0/Resources/config/monolog.xml#L17

サービスの定義について。 [sic]

#app/config/services.yml 

services: 
    # default configuration for services in *this* file 
    _defaults: 
     # automatically injects dependencies in your services 
     autowire: true 
     # automatically registers your services as commands, event subscribers, etc. 
     autoconfigure: true 
     # this means you cannot fetch services directly from the container via $container->get() 
     # if you need to do this, you can override this setting on individual services 
     public: false 

    # makes classes in src/AppBundle available to be used as services 
    # this creates a service per class whose id is the fully-qualified class name 
    AppBundle\: 
     resource: '../../src/AppBundle/*' 
     # you can exclude directories or files 
     # but if a service is unused, it's removed anyway 
     exclude: '../../src/AppBundle/{Entity,Repository,Tests}' 

    #optionally declare individual service as public 
    #AppBundle\Service\MyService: 
    # public: true 

    #alternatively declare the namespace explicitly as public 
    #AppBundle\Service\: 
    # resource: '../../src/AppBundle/Service/*' 
    # public: true 

は、その後のサービスに依存関係を注入するために、あなたは、コンストラクタの引数の型ヒントを追加します。

namespace AppBundle\Service; 

use Psr\Log\LoggerInterface; 

class MyService 
{ 

    private $logger; 

    public function __construct(LoggerInterface $logger) 
    { 
     $this->logger = $logger; 
    } 

} 

autowireが無効になっている場合は、手動でロガーエイリアスを注入するために、あなたのサービスを定義することができます。また

#app/config/services.yml 

services: 

    AppBundle\Service\MyService: 
     arguments: ['@logger'] 
     public: true 

は、コンテナから公的にアクセスできるようにロガーエイリアスを強制するために、あなたのアプリケーションサービスの設定でサービス別名を再宣言することができます。

#app/config/services.yml 

services: 

    #... 

    logger: 
     alias: 'monolog.logger' 
     public: true