2012-07-10 45 views
1

我目前正試圖配置我的Symfony的依賴注入,使我能夠使用父服務。繼我在http://symfony.com/doc/current/components/dependency_injection/parentservices.html發現描述我試圖建立以下類別爲第一個測試:Symfony2的依賴注入與母公司業務不工作

Mailer.php:

namespace testing; 

class Mailer 
{ 
    private $transport; 

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

    public function getTransport() { 
     return $this->transport; 
    } 
} 

MailManager.php:

namespace testing; 

abstract class MailManager 
{ 
    protected $mailer; 

    public function setMailer(Mailer $mailer) 
    { 
     $this->mailer = $mailer; 
    } 
} 

NewsletterManager.php:

namespace testing; 

class NewsletterManager extends MailManager { 
    function getTransport() { 
     return $this->mailer->getTransport(); 
    } 
} 

services.yml:

parameters: 
    mailer.transport: sendmail 

services: 
    mailer: 
     class:  testing\Mailer 
     arguments: [%mailer.transport%] 
    mail_manager: 
     class:  testing\MailManager 
     abstract: true 
     calls: 
      - [ setMailer, [ @mailer ] ] 
    newsletter_manager: 
     class:  testing\NewsletterManager 
     parent: mail_manager 

但是,當我嘗試用下面的代碼運行此配置:

require_once 'ClassLoading.php'; 
use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

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

$nm = $container->get('newsletter_manager'); 
echo $nm->getTransport(); 

我總是得到這樣的錯誤:

PHP Fatal error: Call to a member function getTransport() on a non-object in C:\IGMI\workspace\TryingHard\loading\NewsletterManager.php on line 7 

有一兩件事似乎是的二傳手抽象類是從來沒有所謂的,但即使我做了抽象類混凝土和從與二傳居然被稱爲容器檢索,這並沒有解決郵件對象的問題被未設置。所以它表明,建立子類關係也存在問題。

任何幫助,將不勝感激!

回答

4

你應該編譯容器製造商前嘗試接入服務,我想...... 所以它應該是這樣的:

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

use Symfony\Component\DependencyInjection\ContainerBuilder; 

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

$container->compile(); //add this line 

$nm = $container->get('newsletter_manager'); 
echo $nm->getTransport(); 
+0

非常感謝,這解決了我的問題!在本教程的基本組成部分無處提到的編譯,一切運行良好,沒有它之前...對於那些有興趣誰還有這個單獨的一章:http://symfony.com/doc/current/components /dependency_injection/compilation.html – 2012-07-11 13:28:30

+0

有人能告訴我在哪裏把$容器 - >編譯()? 難道是MyBundleExtension? – 2014-07-07 22:00:09

+1

的Symfony標準版編譯容器,所以如果你有喜歡的擴展MyBundleExtension(所以你用Symfony的;))你還沒有做到這一點 – l3l0 2014-07-09 18:51:08