2016-10-10 80 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 iff.php

<?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 \組件\串行\ DIFF \ 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, 
// .. 

應用\設置\ 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 \控制器\ EventMapController.php

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

// ****問題

,如果我嘗試使用自定義記錄如下圖所示我正在錯誤舊版本:

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 \組件\串行\ DIFF \ 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

你如何實例化'Diff'對象? – zerkms

+0

你可以展示如何將'EventDiff'定義爲服務嗎? – martin

+0

類別'EventDiff'是一個服務,它從'Diff'類延伸。 Diff類有幾種方法,這些方法對於所有計算兩個實例之間的差異(如果是相同類型的實體)的實體是通用的,因此我擴展了這個類中的每個EntityDiff.php。另外。 class'Diff'有一個記錄器來記錄來自其方法的消息。 – olga

回答

0

問題是最有可能在你實例化EventDiffDiff的方式錯誤消息建議。 LogWriter似乎沒事。

您是否將EventDiff定義爲服務以及正確的依賴關係?

編輯:在EventDiff你打電話parent::__construct();沒有任何參數。然而,父類Diff類取一個參數。您可能想要向EventDiff注入服務,該服務將在構造函數中傳遞給其父項。

+0

我對問題進行了更正。它被定義爲'meeting.diff.event: class:'MeetingBundle \ Components \ Serializer \ Diff \ EventDiff'。 – olga

+0

似乎錯誤是在記錄器和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 

希望這有助於

相關問題