2017-02-24 81 views
0

我有幾個DiTest命名空間下的示例類;如何在symfony /依賴注入中使自動佈線工作?

namespace DiTest; 

class Transport 
{ 
    public function send($mail) 
    { 
     echo $mail . PHP_EOL; 
     echo 'Mail Sent'; 
    } 
} 

class Mailer 
{ 
    protected $transport; 

    public function __construct(Transport $transport) 
    { 
     $this->transport = $transport; 
    } 

    public function send($mail) 
    { 
     if ($this->transport) { 
      $this->transport->send($mail); 
     } else { 
      echo 'No transport set!' . PHP_EOL; 
     } 
    } 
} 

然後我有這個yaml配置文件;

services: 
    transport: 
     class: DiTest\Transport 
    mailer: 
     class: DiTest\Mailer 
     autowire: true 

最後我有這樣的index.php中

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 

require_once __DIR__.'/vendor/autoload.php'; 

$container = new ContainerBuilder(); 
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '\src')); 
$loader->load('services.yml'); 

$mailer = $container->get('mailer'); 
$mailer->send('Hello world!'); 

它試圖實例化梅勒類沒有通過構造函數的參數。任何人都可以告訴我哪裏出錯了。

我們應該如何調試自動裝配問題?

+2

我可以回答最後一個問題:通過不使用autowire調試autowire。你在使用S2.8嗎? – Cerad

+0

我認爲autowire只能用於快速原型設計。我只使用依賴注入,配置和yaml。它們都是3.2版本。我只想看看symfony的di容器如何工作。 – srayner

回答

0

在嘗試獲取所有需要解析的自動裝配參考的郵件服務之前,您需要先致電$container->compile();