2016-10-10 138 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 

希望这有助于

相关问题