【问题标题】:How do I get auto-wiring to work in symfony/dependency-injection?如何在 symfony/dependency-injection 中自动连接工作?
【发布时间】:2017-02-24 22:26:19
【问题描述】:

我在 DiTest 命名空间下有几个示例类;

namespace DiTest;

class Transport
{
    public function send($mail)
    {
        echo $mail . PHP_EOL;
        echo 'Mail Sent';
    }
}

class Mailer
{
    protected $transport;

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

    public function send($mail)
    {
        if ($this->transport) {
            $this->transport->send($mail);
        } else {
            echo 'No transport set!' . PHP_EOL;
        }
   }
}

然后我有这个 yaml 配置文件;

services:
    transport:
        class: DiTest\Transport
    mailer:
        class: DiTest\Mailer
        autowire: true

最后我在 index.php 中有这个

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

require_once __DIR__.'/vendor/autoload.php';

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

$mailer = $container->get('mailer');
$mailer->send('Hello world!');

它尝试在不传入构造函数参数的情况下实例化 Mailer 类。谁能告诉我哪里出错了。

我们应该如何调试自动装配问题?

【问题讨论】:

  • 我可以回答最后一个问题:通过不使用自动装配来调试自动装配。您使用的是 S2.8 吗?
  • 我认为 autowire 应该只用于快速原型设计。我只使用依赖注入、配置和 yaml。它们都是 3.2 版本。我只是想看看 symfony 的 di 容器是如何工作的。

标签: php symfony dependency-injection autowired


【解决方案1】:

您需要先致电$container->compile();,然后再尝试获取邮件服务以解决所有自动装配的引用。

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多