2017-09-04 4 views
0

PHP-DIでプロジェクトを作成しようとしましたが、問題があります。PHP-DI作成したクラスにコンストラクタパラメータを挿入できません

これはトレースです:

ここtrace

は、コードは次のとおりです。

Containerクラス:

$this->containerBuilder->addDefinitions([ 
     'Configuration' => DI\Object('Hetwan\Core\Configuration')->constructor($this->getRootDir().'/app/config/config.yml'), 
     'Database' => DI\object('Hetwan\Core\Database') 
]); 

Configurationクラス:

namespace Hetwan\Core; 

use Symfony\Component\Yaml\Yaml; 

class Configuration 
{ 
private $attrs; 

public function __construct($configFilePath) 
{ 
    $this->attrs = Yaml::parse(file_get_contents($configFilePath)); 
} 

public function get($attrPath) 
{ 
    $el = $this->attrs; 

    foreach (explode('.', $attrPath) as $attr) 
    { 
     if (!isset($el[$attr])) 
      throw new ConfigurationException("Unable to get '{$attrPath}'.\n"); 

     $el = $el[$attr]; 
    } 

    return $el; 
} 
} 

Databaseクラス:

namespace Hetwan\Core; 

use Hetwan\Core\Configuration; 

class Database 
{ 
/** 
* @Inject 
* @var Configuration 
*/ 
private $config; 

private $entityManager; 

public function create($entitiesPath) 
{ 
    $dbParameters = [ 
     'driver' => 'pdo_mysql', 
     'user' => $config->get('database.user'), 
     'password' => $config->get('database.password'), 
     'dbname' => $config->get('database.name') 
    ]; 

    $this->entityManager = EntityManager::create($dbParameters, Setup::createAnnotationMetadataConfiguration([$entitiesPath], false)); 
} 

public function getEntityManager() 
{ 
    return $this->entityManager; 
} 
} 

私は何の問題もなく$container->get('Configuration')にアクセスもできますし、それが動作します。

データベースクラスの作成時に、PHP-DIはConfigurationのインスタンスを再作成しようとしていると思います。なぜシングルトンインスタンスが既に存在するのかわかりません。

ありがとうございました!

+0

いいえ「の設定が」私のサービス名であり、それは動作しますが、それは、Databaseクラスのコンフィギュレーションの注入が問題 –

+0

は、私は '使用することができます@var Configuration'または' \ Hetwan \コア\ Configuration'何もチャン@varエラースタックのe –

+0

コメントは答えに展開されました。それは間違っているかもしれないが、うまくいけば私はコメントでしたよりも私の感情をよく説明した。 – IMSoP

答えて

2

注釈@var Configurationは、ファイルの名前空間に基づいてクラス名として解釈され、コンテナ内のサービスの名前ではなく、宣言を使用します。

他の手がかりがなければ、自動DIは完全修飾クラス名(Hetwan\Core\Configuration)と一致するサービスを探すと考えられます。ただし、サービスはConfigurationと登録されているため、一致しません。そのため、DIはnew \Hetwan\Core\Configuration();を使用して自動的にインスタンスを作成しようとしていますが、コンストラクタに必須のパラメータがあるため失敗します。それは\Hetwan\Core\Configurationのインスタンスを探しに行くとき

$this->containerBuilder->addDefinitions([ 
     'Hetwan\Core\Configuration' => DI\Object('Hetwan\Core\Configuration') 
      ->constructor($this->getRootDir().'/app/config/config.yml') 
]); 

そして、それがそのサービスを見つけるだろう、むしろ:私はあなたが何をする必要があるか疑う

はこのように、完全修飾名を使用してサービスを登録していますコンストラクタを実行しようとするよりも。

PHP-DIマニュアルshows how you can simplify thisthe magic constant ::classを使用する:また

use Hetwan\Core\Configuration; 

$this->containerBuilder->addDefinitions([ 
     Configuration::class => DI\Object() 
      ->constructor($this->getRootDir().'/app/config/config.yml') 
]); 

、あなたは、むしろそれは、プロパティの型に基づいて推測したよりも、according to the documentation on annotationsを注入するサービスPHP-DIを伝えることができます。

/** 
* @Inject("Configuration") 
*/ 
private $config; 
+0

+1、これを避ける良い方法は、コンテナの設定で 'Configuration :: class'表記を使うことです。それは、正しい、有効なクラス名を持つように強制します。 –

+1

@MatthieuNapoli良い点。マニュアルを見ると、 'DI \ Object'コールでクラス名を繰り返す必要がないので、簡単な例を追加しました。 – IMSoP

+0

完璧なおかげで! –

関連する問題