1

私は現在、親サービスを使用できるように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

一つは、抽象クラスのセッターが呼び出されないようですが、抽象クラスを具体的にして、実際にセッターが呼び出されているコンテナーから取得しても、メーラーオブジェクトの問題は解決しません。設定されていません。したがって、サブクラスの関係の確立にも問題があるように思われます。

どんな助けでもいただければ幸いです!

4

1 に答える 1

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();
于 2012-07-10T22:25:44.827 に答える