[英]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)從數據庫中獲取模型。 因此,將用戶注入到控制器中是沒有意義的,因為根據定義,有很多用戶 (有一個完整的表)。
通常要做的是注入提供一種檢索模型的方法的對象/服務。 根據庫的不同,有時將這些對象稱為“ 存儲庫 ”。 所以它是這樣的:
從技術上講,您遇到的問題是(我認為)PHP-DI試圖創建一個新的User實例(使用new
)和PHPActiveRecord試圖自動連接到數據庫。 由於沒有為數據庫配置任何內容(我想),因此PHPActiveRecord失敗。
簡而言之,該怎么辦?
如果要轉儲PHPActiveRecord,則可以看看Doctrine(更復雜)或Propel (應該更接近PHPActiveRecord的功能)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.