Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将PHP-DI定义设置为PHPActiveRecord连接?_Php_Activerecord_Dependency Injection_Containers_Php Di - Fatal编程技术网

如何将PHP-DI定义设置为PHPActiveRecord连接?

如何将PHP-DI定义设置为PHPActiveRecord连接?,php,activerecord,dependency-injection,containers,php-di,Php,Activerecord,Dependency Injection,Containers,Php Di,我是依赖注入的初学者,我正在Apache2和MySql项目下的PHP 5.5.9中使用以下工具: PHP-DI:4.2.*@dev-管理DIC; PHPActiveRecord:devmaster-as-ORM; 我所有的类都是由composer自动加载的 通过阅读PHP-DI的文档并运行与自动连接、注释和配置相关的示例,我已经对PHP-DI的定义有了一些了解,并且我已经将其用于我自己的类,但现在我被困于如何设置供应商库,如PHPActiveRecord 通常,要使用PHPActiveRecor

我是依赖注入的初学者,我正在Apache2和MySql项目下的PHP 5.5.9中使用以下工具:

PHP-DI:4.2.*@dev-管理DIC; PHPActiveRecord:devmaster-as-ORM; 我所有的类都是由composer自动加载的

通过阅读PHP-DI的文档并运行与自动连接、注释和配置相关的示例,我已经对PHP-DI的定义有了一些了解,并且我已经将其用于我自己的类,但现在我被困于如何设置供应商库,如PHPActiveRecord

通常,要使用PHPActiveRecord,您只需定义如下连接设置:

$cfg = ActiveRecord\Config::instance();
$cfg->set_model_directory('/path/to/your/model_directory');
$cfg->set_connections(
    ['development' => 'mysql://username:password@localhost/database_name']
);
或者这个:

ActiveRecord\Config::initialize(function($cfg)
{
    $cfg->set_model_directory('/path/to/your/model_directory');
    $cfg->set_connections(['development' =>
    'mysql://username:password@localhost/database_name']);
});
最后,您的模型应该扩展ActiveRecord\Model,您就可以开始了

目前,我正试图通过使用诸如PHP-DI文档之类的注释将ActiveRecord模型注入控制器:

<?php

    namespace Controller;

    use Model\User;

    class TestController
    {
        /**
        * @Inject
        * @var User
        */
        protected $user;

        public function index()
        {
            echo $this->user->retrieveStatus();
        }
    }
似乎没有为ActiveRecord提供字符串连接

我只是认为我需要一个合适的文件配置设置DI\factory,我认为它可以根据上面的连接定义返回一个ActiveRecord\Config实例

另一点让我担心的是,PHPActiveRecord在其API中有大量的单例和静态函数,据我所知,由于有点紧耦合的问题,它被认为是一种反模式,在这种情况下,没有定义良好的注入点(如构造函数),这对DI的管理似乎没有好处和/或塞特注射


如果你认为我对我的问题不够清楚,请询问我,我可以提供更多信息

恐怕没有好办法解决你的问题。正如您所说,PHPActiveRecord是一个基于单例和静态方法构建的库,它不能很好地与依赖注入相结合

但在您的示例中,主要是尝试注入一个模型对象。这通常是你永远不应该做的事情。您应该注入配置值、服务或在整个应用程序中共享的任何对象,而不是模型

模型是根据查询(例如ID)从数据库中获取的。因此,在控制器中插入用户是没有意义的,因为根据定义,有很多用户,并且有一整张用户表

通常所做的是注入提供检索模型方法的对象/服务。根据库的不同,这些对象有时称为存储库。所以它是这样的:

$cfg = ActiveRecord\Config::instance();
$cfg->set_model_directory('/path/to/your/model_directory');
$cfg->set_connections(
    ['development' => 'mysql://username:password@localhost/database_name']
);
您可以将UserRepository注入控制器、数据库对象、EntityManager或其他任何内容 然后,您可以使用该对象在控制器中获取所需的任何用户 从技术上讲,这里遇到的问题是,我认为PHP-DI试图使用new和PHPActiveRecord创建一个新的用户实例,试图自动连接到数据库。由于没有为数据库配置任何内容,我想PHPActiveRecord会失败

简言之,该怎么办

保持PHPActiveRecord的初始化不在PHP-DI中,因为它需要在每个请求上执行 通过PHPActiveRecord的方式创建/获取/…模型,即静态方法。PHP-DI对此无能为力
如果您想转储PHPActiveRecord,可以看看哪一个更复杂,或者哪一个应该更接近PHPActiveRecord的功能。

顺便说一句,这与PHPActiveRecord无关,因此我将其发布在评论中,但您应该尽量避免在composer.json中使用不稳定的版本。我今天发布了PHP-DI的4.3.0版,你可以用它来代替4.2.*@dev。你肯定我只是复制并粘贴了我得到的第一个设置,但我现在要更改它。谢谢!非常感谢您如此专注的回答!这里不好的是没有我所希望的神奇解决方案,好的一点是,看到你的预测,我可以意识到我早期的怀疑是正确的,不知何故,这意味着我没有像我认为的那样愚蠢。这就是我试图将模型直接注入控制器的真正原因,因为我发现在DI的循环过程中,PHPActiveRecord应该尝试实例化一个新对象并启动一个数据库连接。我希望DI/Factory能够以某种方式管理它,并为定义良好的ActiveRecord\Config实例提供服务,但我看到,这么多的单例数据库连接方式应该使它不可行。所以,我100%同意您关于模型的观点,实际上我使用具有域业务逻辑的真实服务对象,并使用AR实例,就像查询数据接口(如存储库模式)一样。我尝试使用AR的原因在于它的直观和优雅的API,但现在我可以看出它与DI有多么不兼容。Doctrine是一个伟大的部分,以前已经使用过它,但让我感觉像是在编程Java JPA的感觉,我现在不感兴趣。看起来不错!您是否已经将其用于PHP-DI?再次感谢您的关心!我个人使用过Doctrine,但没有使用PHP-DI。是的,你可以
使用DI\factory在PHP-DI中设置ActiveRecord\config的配置,但只有在注入ActiveRecord\config时才会执行。我认为您不需要注入它,因为您从不直接使用Config,而是在模型上使用静态方法,所以我担心它只会更加混乱,而不是有用。没错!我认为唯一可行/应该可行的方法是进行大规模重构,以清除所有该死的单例,并定义一个依赖关系图来引导类之间的注入交互。我认为这需要足够的时间来让我放弃,并拿起一个新的ORM;我将期待spreep的源代码和spreep+DI问题,以检查它是否是一个正确的选择。谢谢你的关注和关心!如果您对这个问题有任何其他想法,以及对DI工作流的另一个可能的好建议,我很高兴知道。