在你的
SystemUser
$this->systemUserDetatils = new \MyApp\Models\SystemUser\SystemUserDetails();
的构造函数
SystemUserDetails
需要一个
Database
打电话
new
直接地
您没有使用PHP-DI
. 通过这样做,你就是
躲藏
依赖性,如果您想使用依赖性注入系统,这正是您想要避免的。
如果
系统用户
取决于
(“需要”)
,依赖项应该是显式的(例如,在其构造函数中声明)。
对于这样的系统。你在问题中显示的定义文件不符合要求
the best practices recommended by PHP-DI
.
你的设计远非完美,我也不确定你的最终目标,但如果你做了这样的事情,它可能会起作用:
<?php
// src/Database.php
class Database {
public function getDb() : string {
return 'veryDb';
}
}
<?php
// src/SystemUserDetails.php
class SystemUserDetails {
protected $db;
public function __construct(Database $db)
{
$this->db = $db;
}
public function getDetails() {
return "Got details using " . $this->db->getDb() . '.';
}
}
<?php
// src/SystemUser.php
class SystemUser {
protected $details;
public function __construct(SystemUserDetails $details, $userId=null) {
$this->details = $details;
}
public function getUser() {
return "Found User. " .$this->details->getDetails();
}
}
<?php
//init.php
require_once('vendor/autoload.php');
// build the container. notice I do not use a definition file.
$containerBuilder = new \DI\ContainerBuilder();
$container = $containerBuilder->build();
// get SystemUser instance from the container.
$userInstance = $container->get('SystemUser');
echo $userInstance->getUser(), "\n";
其结果是:
Found User. Got details using veryDb.