簡體   English   中英

使用父服務的Symfony2依賴注入不起作用

[英]Symfony2 Dependency Injection with parent services does not work

我正在嘗試配置我的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的容器中檢索它,這也無法解決郵件程序對象的問題沒有設定。 所以它告訴我,建立子類關系也存在問題。

任何幫助,將不勝感激!

您應該在嘗試訪問服務之前編譯容器構建器我認為...所以它應該如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM