【问题标题】:Symfony2 Dependency Injection with parent services does not workSymfony2 依赖注入与父服务不起作用
【发布时间】:2012-07-10 14:50:37
【问题描述】:

我目前正在尝试配置我的 Symfony 依赖注入,以便能够使用父服务。按照我在http://symfony.com/doc/current/components/dependency_injection/parentservices.html 中找到的描述,我尝试设置以下类作为第一个测试:

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

一件事似乎是抽象类的setter从未被调用,但即使我将抽象类具体化并从容器中检索它并实际调用setter,这并不能解决问题未设置邮件程序对象。所以在我看来,子类关系的建立也有问题。

任何帮助将不胜感激!

【问题讨论】:

    标签: php symfony dependency-injection


    【解决方案1】:

    你应该在尝试访问服务之前编译容器构建器我认为...... 所以它应该看起来像:

    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();
    

    【讨论】:

    • 非常感谢,这解决了我的问题!教程的基本部分没有提到编译,之前没有它其他一切都可以正常工作......对于那些感兴趣的人,有一个单独的章节:symfony.com/doc/current/components/dependency_injection/…
    • 有人能告诉我把 $container->compile() 放在哪里吗?它在 MyBundleExtension 中吗?
    • Symfony 标准版编译容器,所以如果你有像 MyBundleExtension 这样的扩展(所以你使用 Symfony ;))你还没有这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多