2012-07-10 49 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