如何获取 PHP DI 容器?



如何使用 PHP DI 加载数据库容器? 这是我迄今为止尝试过的变体之一。

设置.php

<?php 
use MyAppCoreDatabase;
use MyAppModelsSystemUser;
return [
'Database'      => new Database(), 
'SystemUser'    => new SystemUser()
];

初始化.php

$containerBuilder   = new DIContainerBuilder(); 
$containerBuilder->addDefinitions('Settings.php');
$container          = $containerBuilder->build();

系统用户详细信息.php

<?php 
namespace MyAppModelsSystemUser;
use MyAppCoreDatabase;
use MyAppCoreConfig;
use MyAppHelpersSession;

/**
*
*  System User Details Class
*
*/
class SystemUserDetails 
{
/*=================================
=            Variables            =
=================================*/
private $db;

/*===============================
=            Methods            =
================================*/
/**
*
*  Construct
*
*/
public function __construct(Database $db)
{
# Get database instance
// $this->db           = Database::getInstance();
$this->db           = $db;
}

/**

参数太少,无法运行 MyApp\Models\SystemUser\SystemUserDetails::__construct(), 0 在第 54 行传入/www/myapp/models/SystemUser.php 并且正好是 1 个预期 文件:/www/myapp/models/SystemUser/SystemUserDetails.php

数据库不应该自动加载吗?

跟踪:

  1. 目前,我的主index.php文件扩展init.php这是它创建容器的文件(粘贴在帖子中的代码部分)。

  2. 然后我调用App类,它获取 URL(mysite.com/login/user_login) 并实例化一个新的控制器类并运行提到的方法,在这种情况下,它是第一页 -MyApp/Contollers/Login.php

    1. user_login方法获取凭据,验证它们,如果它们有效,则使用 SystemUser 对象登录。

系统用户类:

namespace MyAppModels;

class SystemUser
{
public $id;
# @obj SystemUser profile information (fullname, email, last_login, profile picture, etc')
protected $systemUserDetatils;

public function __construct($systemUserId = NULL)
{
# Create systemUserDedatils obj
$this->systemUserDetatils   = new MyAppModelsSystemUserSystemUserDetails();
# If system_user passed
if ( $systemUserId ) {
# Set system user ID
$this->id                   = $systemUserId;
# Get SysUser data
$this->systemUserDetatils->get($this);
} else {
# Check for sysUser id in the session:
$systemUserId                   = $this->systemUserDetatils->getUserFromSession();
# Get user data from session 
if ( $systemUserId ) {
# Set system user ID
$this->id                   = $systemUserId;
# Get SysUser data
$this->systemUserDetatils->get($this);
}
}
}
}

PHP-DI 工作正常。

在你的SystemUser课上,你正在做:

$this->systemUserDetatils   = new MyAppModelsSystemUserSystemUserDetails();

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 DIContainerBuilder();
$container          = $containerBuilder->build();
// get SystemUser instance from the container.
$userInstance = $container->get('SystemUser');
echo $userInstance->getUser(), "n";

这导致:

Found User. Got details using veryDb.

相关内容

  • 没有找到相关文章

最新更新