【发布时间】:2019-01-13 10:51:38
【问题描述】:
如何使用PHP DI 加载数据库容器? 这是迄今为止我尝试过的变体之一。
设置.php
<?php
use MyApp\Core\Database;
use MyApp\Models\SystemUser;
return [
'Database' => new Database(),
'SystemUser' => new SystemUser()
];
init.php
$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->addDefinitions('Settings.php');
$container = $containerBuilder->build();
SystemUserDetails.php
<?php
namespace MyApp\Models\SystemUser;
use MyApp\Core\Database;
use MyApp\Core\Config;
use MyApp\Helpers\Session;
/**
*
* 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() 函数的参数太少,在第 54 行的 /www/myapp/models/SystemUser.php 中传递了 0,而预期正好是 1 文件:/www/myapp/models/SystemUser/SystemUserDetails.php
数据库不应该自动加载吗?
追踪:
目前,我的主要
index.php文件扩展了init.php,这是它创建容器的文件(在帖子中粘贴了代码部分)。-
然后我调用
App类,它获取 URL(mysite.com/login/user_login) 并实例化一个新的控制器类并运行上述方法,在本例中,它是第一页 -MyApp/Contollers/Login.php。-
user_login方法获取凭据,验证它们,如果它们有效,则使用 SystemUser 对象登录。
-
SystemUser 类:
namespace MyApp\Models;
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 \MyApp\Models\SystemUser\SystemUserDetails();
# 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);
}
}
}
}
【问题讨论】:
-
它看起来像
SystemUser类扩展SystemUserDetails根据构造函数需要一个数据库实例作为参数,尝试将数据库实例作为参数传递给SystemUser类,看看它是否有效 -
@Shahin 为什么你相信
SystemUser扩展了SystemUserDetails?你从哪里得到的? -
@Shahin 是对的,但这不是假设通过将 DB 类注入我想要的任何类来直接工作吗?我可能对依赖注入不了解的地方在哪里,希望得到解释。
-
@yivi 我没有显示什么?你想看什么,我没有问题可以添加到我的帖子中..
-
是否需要运行
$userManager = $container->get('SystemUserDetails');才能获得
标签: php oop dependency-injection containers php-di