2016-10-10 4 views
1

サービスコンテナを使用しないSymfony 2のカスタムクラスでカスタムクラスをロード/アクセスするには?symfony2、acess /別のカスタムクラスでカスタムクラスを使用

私は以下のようにカスタムロガーを使用しようとすると、私はエラーを取得しています:

Catchable Fatal Error: Argument 1 passed to MeetingBundle\Components\LogWriter::__construct() must implement interface Symfony\Component\HttpKernel\Log\LoggerInterface, none given, called in C:\Bitnami\wampstack-5.6.20-0\apache2\htdocs\sym\just2\src\MeetingBundle\Components\Serializer\Diff\EventDiff.php on line 23 and defined

スタックトレース:

in src\MeetingBundle\Components\LogWriter.php at line 12 - 
private $logger; 
public function __construct(LoggerInterface $logger) // here they show the error 
{ 
    $this->logger = $logger; 
} 

SRC \ MeetingBundle \コンポーネント\ LogWriter.php

<?php 

namespace MeetingBundle\Components; 

use Symfony\Component\HttpKernel\Log\LoggerInterface; 

class LogWriter 
{ 

    private $logger; 

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

    public function log($msg) 
    { 
     $this->logger->log($msg); 
    } 
} 

src \ MeetingBundle \ Components \ Serializer \ Diff \ D

<?php 

namespace MeetingBundle\Components\Serializer\Diff; 

//use MeetingBundle\Components\LogWriter; 

class Diff 
{ 
    private $diffCluesArr; 
    private $name; 
    private $logWriter; 

    public function __construct ($logger) { 
     $this->name= ""; 
     $this->diffCluesArr = []; 
     $this->logWriter = $logger; 
     //$this->logWriter = new $logWriter; //changed here 
    } 

    public function array_diff_str_o ($arr1, $arr2, $str) { 
     $this->logWriter("<br> In Diff function array_diff_str_o "); 
    //... 

SRC \ MeetingBundle \コンポーネント\シリアライザ\デフ\ EventDiff.php

<?php 

namespace MeetingBundle\Components\Serializer\Diff; 

use MeetingBundle\Components\Serializer\Diff\Diff; 
use MeetingBundle\Components\LogWriter; 

/** 
* Event normalizer 
*/ 
class EventDiff extends Diff 
{ 
    private $diffCluesArr; 
    private $name; 
    private $logw; 

    // does not work 
    // public function __construct (LogWriter $logger) { 
    //  $this->logw= $logger; 
    //  parent::__construct($this->logw); 

    public function __construct() { 
     $this->logw = new LogWriter(); 
     parent::__construct($this->logw);  
     $this->logw("<br> In constructor of EventDiff"); 
     $this->name= "event"; 
     $this->diffCluesArr = array( 
       //1 means compare normally 
       //2 means compare the values of the keys 
       'id' => 1, 
// .. 

アプリ\ CONFIG \ services.yml

services: 
    meeting.logw: 
     class:  MeetingBundle\Components\LogWriter 
     arguments: ["@logger"] 

    meeting.diff.diff: 
     class:  'MeetingBundle\Components\Serializer\Diff\Diff' 
     arguments: ["@meeting.logw"] 

    meeting.diff.event: 
     class: 'MeetingBundle\Components\Serializer\Diff\EventDiff' 
     parent: meeting.logw 
     #the same error: parent: meeting.diff.diff 

SRC \ MeetingBundle \コントローラ\ iff.php EventMapController.php

//.. 
    $diffentiator = $this->get('meeting.diff.event'); 
    $diffentiator->array_diff_str_o($arrEventOld, $arrEventNew, $msg); 
//.. 

// **** QUESTION

古いバージョンを私はエラーを取得しています以下のようにカスタムロガーを使用しようとすると:

Catchable Fatal Error: Argument 1 passed to MeetingBundle\Components\Serializer\Diff\Diff::__construct() must be an instance of MeetingBundle\Components\Serializer\Diff\LoggerInterface, none given, called in C:\Bitnami\wampstack-5.6.20-0\apache2\htdocs\sym\just2\src\MeetingBundle\Components\Serializer\Diff\EventDiff.php on line 16 and defined

間違いがありますか?コードは以下の通りです:

just2\src\MeetingBundle\Components\LogWriter.php

<?php 

namespace MeetingBundle\Components; 

use Symfony\Component\HttpKernel\Log\LoggerInterface; 

class LogWriter 
{ 

    private $logger; 

    public function __construct(LoggerInterface $logger) // the place of error 
    { 
     $this->logger = $logger; 
    } 

    public function log($msg) 
    { 
     $this->logger->log($msg); 
    } 
} 

just2\src\MeetingBundle\Components\Serializer\Diff\Diff.php

<?php 

namespace MeetingBundle\Components\Serializer\Diff; 

use MeetingBundle\Components\LogWriter; 

class Diff 
{ 
    private $logWriter; 

    public function __construct (LoggerInterface $logger) { 
     // the first mistake 
     $this->logWriter = $logger; 
    } 

    public function array_diff_str_o ($arr1, $arr2, $str) { 
     $this->logWriter("<br> In Diff function array_diff_str_o "); 
    //.. 
} 

// SRC \ MeetingBundle \コンポーネント\シリアライザ\デフ\ EventDiff.php

<?php 

namespace MeetingBundle\Components\Serializer\Diff; 

use MeetingBundle\Components\Serializer\Diff\Diff; 
/** Provides clue how to calculate the differences between entities instances */ 
class EventDiff extends Diff 
{ 
    private $diffCluesArr; 
    private $name; 

    public function __construct() { 
     parent::__construct(); 
     $this->logWriter("<br> In constructor of EventDiff"); 
     $this->name= "event"; 
     $this->diffCluesArr = array( 
       //1 means compare normally 
       //2 means compare the values of the keys 
       'id' => 1, 
//... 

just2 \ src \ MeetingBundle \ Controller \ EventMapController.php

/** * @Route("/edit/{id}", name="event_jsMap_edit") 
    * @Method("GET|POST") 
    * @Template("MeetingBundle:Event:ev_jsMap_edit.html.twig") 
    */ 
    public function editAction($id, Request $request) 
    { 
... 
$diffentiator = $this->get('meeting.diff.event'); 
$diffentiator->array_diff_str_o($arrEventOld, $arrEventNew, $msg); 
... 

私もlogwriteをサービスにしましたが、おそらくそれは必要ではなく、私はサービスであることを望んでいません。私はないサービスコンテナの一部として、個々のクラスとしてそれを使用したいと思います: アプリ\ CONFIG \ services.yml

services: 
    events.logger: 
     class:  MeetingBundle\Components\LogWriter 
     arguments: ["@logger"] 

    meeting.diff.event: 
     class: 'MeetingBundle\Components\Serializer\Diff\EventDiff' 

    #class Diff is not a service. Class EventDiff extends from Diff. 
+0

? – zerkms

+0

'EventDiff'をサービスとしてどのように定義するかを示すことができますか? – martin

+0

クラス 'EventDiff'はサービスであり、クラス' Diff'から拡張されています。クラス 'Diff'には、同じタイプのエンティティ、つまりこのクラスからそれぞれの' EntityDiff.php'を拡張する場合に、2つのインスタンスの違いを計算するすべてのエンティティに共通するいくつかのメソッドがあります。さらに。クラス 'Diff'はそのメソッドからメッセージを記録するためのロガーを持っています。 – olga

答えて

0

問題は、あなたのようにEventDiffクラスのインスタンス化Diff方法で最も可能性が高いですエラーメッセージが表示されます。 LogWriterと思われます。

正しい依存関係を持つサービスとしてEventDiffを定義していますか?

編集:EventDiffには、パラメータなしでが呼び出されています。しかし、親のDiffクラスは1つのパラメータをとります。 EventDiffにコンストラクタの親に渡されるサービスを注入したいと思うかもしれません。

+0

私は質問に訂正しました。それは 'meeting.diff.event: クラス: 'MeetingBundle \ Components \ Serializer \ Diff \ EventDiff''として定義されています。 – olga

+0

エラーがloggerおよびlogWriter変数にあるようです。時には私は疲れて、変数をミックスします。 – olga

+0

私は自分の答えを更新しました。あなたは親コンストラクターを正しく呼んでいません。 – martin

0

Manage Common Dependencies with Parent Servicesです。次のようにparent属性を定義するサービスを定義してみてください。

services: 
    events.logger: 
     class:  MeetingBundle\Components\LogWriter 
     arguments: ["@logger"] 

    meeting.diff.event: 
     class: 'MeetingBundle\Components\Serializer\Diff\EventDiff' 
     parent: events.logger 

希望あなたは `Diff`オブジェクトをインスタンス化するにはどうすればよいこのヘルプ

関連する問題