我试图理解依赖注入,理论上,我得到了它,但是,我想做一个例子来帮助我。但是,我收到以下错误
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'];
很明显,我看不到它
答案 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?
有关