PHP-DI работает правильно.
В вашем SystemUser
классе вы делаете:
$this->systemUserDetatils = new \MyApp\Models\SystemUser\SystemUserDetails();
Для конструктора SystemUserDetails
требуется объект Database
, который вы не передаете.
Вызывая new
напрямую, вы не используете PHP-DI . Делая это, вы скрываете зависимость, чего якобы и пытаетесь избежать, если хотите использовать систему внедрения зависимостей.
Если SystemUser
зависит («потребности») SystemUserDetails
, зависимость должна быть явной (например, объявленной в ее конструкторе).
Более того: Вам не нужен файл определений для такой системы. И файл определений, который вы показываете в своем вопросе, не соответствует рекомендациям, рекомендованным 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.