Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony DI:Uncaught ArgumentCounter错误:函数App::u construct()的参数太少,在第28行的index.php中传递了0,预期正好是1_Php_Symfony_Dependency Injection_Symfony Dependency Injection - Fatal编程技术网

Symfony DI:Uncaught ArgumentCounter错误:函数App::u construct()的参数太少,在第28行的index.php中传递了0,预期正好是1

Symfony DI:Uncaught ArgumentCounter错误:函数App::u construct()的参数太少,在第28行的index.php中传递了0,预期正好是1,php,symfony,dependency-injection,symfony-dependency-injection,Php,Symfony,Dependency Injection,Symfony Dependency Injection,我正在尝试实现Symfonys依赖项注入容器 我设置了两个容器,一个用于数据库,一个用于系统用户 我对App类和SystemUser类使用addArgument(),推到AppclassaSystemUser对象,以及SystemUserclassa数据库对象 index.php: require_once 'vendor/autoload.php'; use TestingDI\App; use Symfony\Component\DependencyInjection\ContainerB

我正在尝试实现Symfonys依赖项注入容器

我设置了两个容器,一个用于数据库,一个用于系统用户

我对
App
类和
SystemUser
类使用
addArgument()
,推到
App
classa
SystemUser
对象,以及
SystemUser
classa
数据库
对象

index.php:

require_once 'vendor/autoload.php';

use TestingDI\App;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

$containerBuilder = new ContainerBuilder();
$containerBuilder->register('database', '\TestingDI\Database');

$containerBuilder->register('system.user', '\TestingDI\SystemUser')
                 ->addArgument(new Reference('database'));

$containerBuilder->register('app', '\TestingDI\App')
                 ->addArgument(new Reference('system.user'));


$database       = $containerBuilder->get('database');
$systemUser     = $containerBuilder->get('system.user');
$app            = $containerBuilder->get('app');

# Initialize App class
$app = new App();
App.php:

<?php 

namespace TestingDI;

use TestingDI\SystemUser; 


class App {

    public $systemUser; 

    public function __construct(SystemUser $systemUser)
    {
        var_dump($systemUser);
    }
}

对于什么是依赖注入以及如何使用依赖注入,似乎存在一个基本的误解

由于您使用依赖项容器来构建应用程序的不同部分,因此您应该从容器中获取这些对象,而不是直接实例化它们

而且,如果要直接实例化它们(例如,
newapp()
),则需要遵守常规语言规则。在这种情况下,构造函数的签名:

public function\u构造(SystemUser$SystemUser)
如果调用构造函数时未向其传递
SystemUser
类的对象,则构造函数将失败,同样,如果以不符合其签名的方式调用构造函数,则任何其他方法/函数都将失败

当你这么做的时候

$app            = $containerBuilder->get('app');
你的应用程序已经“初始化”,你根本不需要调用
new

通过这样做:

$containerBuilder=newcontainerbuilder();
$containerBuilder->register('database','\TestingDI\database');
$containerBuilder->register('system.user','\TestingDI\SystemUser')
->addArgument(新引用('database'));
$containerBuilder->register('app','\TestingDI\app')
->addArgument(新引用('system.user'));
$database=$containerBuilder->get('database');
$systemUser=$containerBuilder->get('system.user');
$app=$containerBuilder->get('app');
你做的相当于:

$database   = new Database();
$systemUser = new SystemUser($database);
$app        = new App($systemUser);
只有你让DI容器为你做这项工作。当然,考虑到您的容器定义有多冗长,这似乎有点毫无意义

但你可以让你的力量为你做大部分的重担,并做以下几件事:

$container=newcontainerbuilder();
$container->autowire(数据库::类);
$container->autowire(SystemUser::class);
$container->autowire(应用程序::类)
->setPublic(真);
$container->compile();
//这将为您提供一个包含所有依赖项的应用程序实例
//在课堂上解决并注入。
$app=$container->get(app::class);

我现在注意到您已经遇到了一个类似的问题,现在我意识到整个问题都与一个简单的误解有关,即DI容器处理什么问题

$app=new app()不会使用DI,是吗?不确定这是意外的原因。不,它应该只接受SystemUser类型变量。(参见应用程序类)。如果我做错了什么,请通知我,我对这个话题很陌生@JonStirlingRight?你没有经过的地方
newapp()
噢,我以为只有在调用时才会创建对象。在这种情况下,如果我想在SystemUser对象中加载数据库对象,我该怎么做@JonStirlingIt是一个非常常见的概念错误。php新操作员对Symfony容器一无所知。从容器中拉出应用程序,而不是将其新建。事实上,看起来你已经在这么做了。所以去掉$app=newapp();完全正确。是的!我做了一个小的研究,并决定它更好地与Symfonys DI只是为了确保我期望的事情工作,因为我想象,我理解这个DIC。。。如果我从SystemUser类连接到数据库(通过数据库类)。。然后让我们假设我创建了一个
newcontroller()
类并注入数据库类(就像我对SystemUser类所做的那样,在构造中我添加了
\uu构造(Database$Database)
)-连接实例不会被终止?到目前为止,我创建了一个静态方法,并在使用数据库的每个类中调用
getDbInstance()
,直到有人告诉我这是一个糟糕的做法autowrite到底做什么,我并没有真正从example@Rick我不完全明白你的意思。但是,如果您正确地使用DI,您几乎不需要编写新的
。您需要从容器中获取服务的实例,而不是手动实例化它们。请参阅我的最新编辑,了解如何使用auto-wiring进行操作。Autowiring为您解决依赖关系,从构造函数签名中“猜测”它们。
$app            = $containerBuilder->get('app');
$database   = new Database();
$systemUser = new SystemUser($database);
$app        = new App($systemUser);