Fatfree php (v3.6.5) 依赖注入容器



有人有一个简单的用法示例吗?

https://fatfreeframework.com/3.6/quick-reference#CONTAINER 页 在我看来似乎不是真正的解释性,但通常我需要找到一种很好的方法来在需要时/地点自动注入对象$db_connection例如 在课堂上实现平滑路由解析的beforeRoute()方法

在移植 selfoss 以使用 DI 时,我按照您链接的文档中的建议选择了骰子。我将容器设置为仅使用 DB 类的单个共享实例,并向其传递连接字符串:

$f3 = Base::instance();
$dice = new DiceDice;
$host = $f3->get('db_host');
$database = $f3->get('db_database');
$dsn = "pgsql:host=$host; dbname=$database";
$dbParams = [
$dsn,
$f3->get('db_username'),
$f3->get('db_password')
];
$dice->addRule(DBSQL::class, [
'constructParams' => $dbParams,
'shared' => true,
]);
$f3->set('CONTAINER', function($class) use ($dice) {
return $dice->create($class);
});

然后 F3 将使用 Dice 容器创建类,以便控制器及其任何依赖项将在构造函数中传递实例化的依赖项:

namespace daos;
class Items {
private DBSQL $db;
public function __construct(DBSQL $db) {
$this->db = $db;
}
public function fetchAll() {
$entries = $this->db->exec(…);
…
}
}

有关如何配置依赖项容器的完整示例,请参阅 selfoss 源代码。

所以,我选择了单例: 数据库类

class DB
{
private static $_instance = null;
private $dbconn = null;
// config files should better be located in more secure dir
const DB_HOST = '127.0.0.1';
const DB_NAME = 'my_db_name';
const DB_USER = 'my_db__user';
const DB_PASS = 'my_db_passw';
const CHARSET = 'utf8';
const DB_PREFIX = '';
///////////////////////////////////
private function __construct () {
$this->dbconn=new DBSQL(
'mysql:host='.self::DB_HOST.';port='.self::DB_PORT.';dbname='.self::DB_NAME,
self::DB_USER,
self::DB_PASSW,
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_PERSISTENT => FALSE)
);
}
////////////////////////////////////
public static function getInstance() {
if (!self::$_instance) {
self::$_instance = new DB();
}
return self::$_instance;
}
//////////////////////////////////
public function connect() {
if ($this->dbconn) {
echo 'Hooray - 1st stage connected!';
return $this->dbconn;
}
else echo '<br>Sad enough, no connection :(((';
}
/////////////  /////////////////  ////////////////////
private function __clone() {  }
private function __wakeup() {  }
}

很抱歉,我刚刚为自己发现了内置的\Prefab类(将扩展到单例(,所以上面的数据库连接我宁愿做LIKE%:

class DB extends Prefab {
private $dbconn;
// ..then just do connection thing
public function connect() {
//////
}

}

最新更新