サービスコンテナを使用しない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.
? – zerkms
'EventDiff'をサービスとしてどのように定義するかを示すことができますか? – martin
クラス 'EventDiff'はサービスであり、クラス' Diff'から拡張されています。クラス 'Diff'には、同じタイプのエンティティ、つまりこのクラスからそれぞれの' EntityDiff.php'を拡張する場合に、2つのインスタンスの違いを計算するすべてのエンティティに共通するいくつかのメソッドがあります。さらに。クラス 'Diff'はそのメソッドからメッセージを記録するためのロガーを持っています。 – olga