当前位置: 首页 > 知识库问答 >
问题:

如何获取PHPDI容器?

崔博延
2023-03-14

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

Settings.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();

系统用户详细信息。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:的参数太少::\uu construct(),0传入/www/MyApp/Models/SystemUser。php位于第54行,正好是一个预期文件:/www/myapp/models/SystemUser/SystemUserDetails。php

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

跟踪:

>

然后我调用App类,它获取URL(mysite.com/login/user\u login)并实例化一个新的控制器类,然后运行前面提到的方法,在本例中,它是第一个页面-MyApp/Contollers/login。php

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);
            }
        }
    }
}

共有1个答案

邹胜泫
2023-03-14

PHP-DI工作正常。

在您正在执行的SystemUser类中:

$this->systemUserDetatils   = new \MyApp\Models\SystemUser\SystemUserDetails();

SystemUserDetails的构造函数需要一个数据库对象,您没有传递该对象。

通过直接调用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.
 类似资料:
  • 问题内容: 我使用Crawljax抓取了动态网页。我可以获取当前的ID,状态和DOM。但我无法获得网站内容。任何人都可以帮助我吗? 如何获取动态/ Java脚本网页内容。 问题答案: 我们可以获取网站源代码cc.getBrowser()。getStrippedDom()); 或cc.getCurrentState()。getDocument();或 此编码是返回源代码(css / java脚本文件

  • 我开始学习Netty 4 Http服务器,但我已经遇到了一个问题。如何以最简单的方式从POST请求中获取内容? 我在浏览Netty的文档,但很复杂。 提前道谢! 编辑:我正在使用这个代码接收数据。 正如您所看到的,有三条注释行返回给我一个异常:

  • 我想让我的知道它们的配置,就像您可以通过元数据获得EC2实例的信息一样。 我可以使用(提供正在监听端口) 获取它的一些数据,但想知道是否有更好的方法,至少是获取容器的完整ID,因为实际上缩短为12个字符,docker似乎对其执行“最佳匹配”。 另外,如何获取docker主机的外部IP(除了访问特定于AWS的EC2元数据之外)

  • 问题内容: 我在php(string)中有一个div,我想获取内容。 例如: 而且我要 样式在变化,我只知道div ID。 更新 这是我的代码,与turbod源相同,结果也相同。 所以这是原始的html 在此代码之后,我得到以下信息:链接 问题答案: 使用php DomDocument类。http://www.php.net/manual/zh/class.domdocument.php

  • 如何从容器内部获取docker的容器名称? 我不能使用“inspect”,因为我必须使用容器内部的脚本从JSON url获取信息。

  • 我有一系列功能。我想在中一些豆子,然后将它们放在中。我应该使用什么方法? 在这里放一些豆子: 我想在这里获取bean: