簡體   English   中英

如何將PHP-DI定義設置為PHPActiveRecord Connection?

[英]How to set PHP-DI definition to PHPActiveRecord Connection?

我是有關依賴注入的初學者,並且在我的PHP 5.5.9(在Apache2和MySql下)項目中使用了以下工具:

我所有的類都曾經被作曲家自動加載。

通過閱讀文檔並運行與自動裝配,注釋和配置有關的示例,我已經對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();
        }
    }

在這里我得到了錯誤:

Fatal error: Uncaught exception 'ActiveRecord\DatabaseException' with message 'Empty connection string' in /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Connection.php:105 

Stack trace: 
#0 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/ConnectionManager.php(33): ActiveRecord\Connection::instance(NULL) 
#1 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Table.php(117): ActiveRecord\ConnectionManager::get_connection(NULL) 
#2 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Table.php(93): ActiveRecord\Table->reestablish_connection(false) 
#3 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Table.php(74): ActiveRecord\Table->__construct('Model\User') 
#4 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Model.php(749): ActiveRecord\Table::load('Model\User') 
#5 /home/ubuntu/workspace/vendor/php-activerecord/php-activerecord/lib/Model.php(262): ActiveRecord\Model::table() 
#6 [internal function]: ActiveRecord\Model- in /home/ubuntu/workspace/vendor/mnapoli/php-di/src/DI/Definition/Resolver/ClassDefinitionResolver.php on line 276

看來,沒有字符串連接提供給ActiveRecord。

我只是相信我需要一個適當的文件配置設置(我認為DI \\ factory)才能根據上述連接定義返回ActiveRecord \\ Config實例。

令我擔心的另一點是,PHPActiveRecord的API中包含大量的Singleton和靜態函數,據我所知,由於存在一些緊密的耦合問題,因此它被認為是反模式,對DI的管理而言,這似乎沒有任何好處。情況下,沒有明確定義的“注入點”,例如構造函數和/或setter注入。

如果您認為我對我的問題還不夠清楚,請向我詢問,我可以提供更多信息。

恐怕您的問題沒有很好的解決方案。 如您所說,PHPActiveRecord是一個基於單例和靜態方法構建的庫,與依賴項注入不能很好地結合使用。

但主要是在您的示例中,您嘗試注入模型對象。 (通常)這是您永遠不應該做的事情。 您應該注入配置值或“服務”或在整個應用程序中共享的任何對象,但不能注入模型。

根據查詢(例如ID)從數據庫中獲取模型。 因此,將用戶注入到控制器中是沒有意義的,因為根據定義,有很多用戶 (有一個完整的表)。

通常要做的是注入提供一種檢索模型的方法的對象/服務。 根據庫的不同,有時將這些對象稱為“ 存儲庫 ”。 所以它是這樣的:

  • 您將UserRepository注入到控制器(或數據庫對象,或EntityManager或其任何對象)中
  • 然后,您可以使用該對象來獲取控制器內所需的任何用戶

從技術上講,您遇到的問題是(我認為)PHP-DI試圖創建一個新的User實例(使用new )和PHPActiveRecord試圖自動連接到數據庫。 由於沒有為數據庫配置任何內容(我想),因此PHPActiveRecord失敗。

簡而言之,該怎么辦?

  • 將PHPActiveRecord的初始化保留在PHP-DI中,因為它需要在每個請求上執行
  • 通過PHPActiveRecord的方式(即靜態方法)創建/獲取/…模型。 PHP-DI在那里無能為力

如果要轉儲PHPActiveRecord,則可以看看Doctrine(更復雜)或Propel (應該更接近PHPActiveRecord的功能)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM