Pimple ArgumentCountError:函数参数太少

时间:2017-08-30 22:32:16

标签: php dependency-injection psr-4 pimple

我试图理解依赖注入,理论上,我得到了它,但是,我想做一个例子来帮助我。但是,我收到以下错误

PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function Main\Services\UserService::__construct(), 0 passed
in ...

这是我的"主要"文件,我称之为 index.php

<?php 
#index.php
require_once 'vendor/autoload.php';

use Main\Controllers\UserController;
use Main\Services\UserService;
use Main\Models\UserModel;
use Pimple\Container;

$container = new Container;
$container['UserModel'] = function($c) {
    return new UserModel();
};

$container['UserService'] = function ($c) {
    return new UserService($c['UserModel']);
};

$container['UserController'] = function ($c) {
    echo "creating a new UserController\n";

    $aUserService = $c['UserService'];
    return new UserController($aUserService);
};

$myUserService = new $container['UserService'];
$myResult = $myUserService->parseGet();
echo $myResult, PHP_EOL;

这是传递给服务的模型

<?php
# Models/UserModel.php
namespace Main\Models;

class UserModel
{
    private $record;

    public function getRecord()
    {
        return [
            'first_name' => 'Bob',
            'last_name'  => 'Jones',
            'email'      => 'bj@example.com',
            'date_joined' => '11-12-2014',
        ];
    }
}

而且,这是服务,它将模型作为它的构造函数参数

<?php
namespace Main\Services;

use Main\Models\UserModel;

class UserService
{
    private $userModel;

    public function __construct(UserModel $userModel)
    {
        echo "verifying that the userModel passed in was a valid UserModel\n";
        $this->userModel = $userModel;

         print_r($this->userModel->getRecord());
    }

    public function parseGet()
    {
        $retVal = $this->userModel->getRecord();

        return json_encode($retVal);
    }
}

因此,理论上,Pimple应该能够实例化 UserService 对象。我甚至验证了传递到 UserService 类的 UserModel 是一个有效的 UserModel 对象(显然它打印出一个数组) )

我错过了什么?有什么我没有考虑到的吗?

哦,这是composer.json文件

{
    "require": {
        "pimple/pimple": "~3.0"
    },
    "autoload": {
        "psr-4": {
            "Main\\" : "./"
        }
    }
}

我创建了一个gitHub链接,因此可以检出并运行项目,而无需复制所有内容(https://github.com/gitKearney/pimple-example

问题是我在行

中有一个额外的 new
$myUserService = new $container['UserService'];

很明显,我看不到它

2 个答案:

答案 0 :(得分:1)

$container['UserService']已经 一个UserService对象。检查你的服务定义:

$container['UserService'] = function ($c) {
    return new UserService($c['UserModel']);
};

在调用$container['UserService']时将其设置为return new UserService($c['UserModel']),对吗?

您的代码基本上是:

$o1 = new UserService($c['UserModel']);
$o2 = new $o2;

答案 1 :(得分:0)

你使用依赖注入容器来释放你自己形成操纵对象的痛苦&#39;依赖。不需要创建新的UserService如果它确实是服务)。在这种情况下,您可以在$container中定义一次,并在需要时使用它。

因此,您可以执行以下操作,而不是创建新的UserService对象并调用其方法parseGet()(您在代码中执行的操作):

$myResult = $container['UserService']->parseGet();

当您定义类似的内容时:

$container['UserService'] = function ($c) {
    return new UserService($c['UserModel']);
};

一旦您尝试访问$ container [&#39; UserService&#39;]

,您就告诉Pimple如何处理UserService的创建

这就是将依赖关系定义为函数的原因。

这可能与您的问题Why use a closure for assignment instead of directly assigning a value to a key?

有关