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

Dependency injection Fatfree php(v3.6.5)依赖项注入容器,dependency-injection,containers,fat-free-framework,Dependency Injection,Containers,Fat Free Framework,有没有人有一个简单的用法示例 页面 在我看来,这并不是一个很好的解释,但一般来说,我需要找到一种很好的方法,在需要的时候/在需要的地方自动插入$db_connection对象,例如。 在类的beforeRoute()平滑路由解析方法中,我选择了singleton: //数据库类 class DB { private static $_instance = null; private $dbconn = null; // config files should bette

有没有人有一个简单的用法示例

页面 在我看来,这并不是一个很好的解释,但一般来说,我需要找到一种很好的方法,在需要的时候/在需要的地方自动插入
$db_connection
对象,例如。
在类的
beforeRoute()
平滑路由解析方法中,我选择了singleton: //数据库类

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 DB\SQL(
      '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() {  }

}
classdb
{
私有静态$\u实例=null;
私有$dbconn=null;
//配置文件最好位于更安全的目录中
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';
常量字符集='utf8';
常量DB_前缀=“”;
///////////////////////////////////
私有函数构造(){
$this->dbconn=new DB\SQL(
'mysql:host='.self::DB_host.';port='.self::DB_port.';dbname='.self::DB_NAME,
self::DB_用户,
self::DB_PASSW,
$options=array(
\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_异常,
\PDO::ATTR_PERSISTENT=>FALSE)
);
}
////////////////////////////////////
公共静态函数getInstance(){
如果(!self::$\u实例){
self::$_instance=new DB();
}
返回self::$\u实例;
}
//////////////////////////////////
公共功能连接(){
如果($this->dbconn){
回声“万岁-第一级连接!”;
返回$this->dbconn;
}
否则我会很伤心,没有联系;
}
/////////////  /////////////////  ////////////////////
私有函数uu clone(){}
私有函数uu wakeup(){}
}

很抱歉,我刚刚发现了我自己的内置\Prefab类(将扩展为单例),因此我更喜欢上面的DB连接%:

class DB extends \Prefab {

    private $dbconn;
// ..then just do connection thing

public function connect() {
//////
}

}

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

$f3=Base::instance();
$dice=新骰子\骰子;
$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\u password')
];
$dice->addRule(DB\SQL::class[
“constructParams”=>$dbParams,
“共享”=>true,
]);
$f3->set('CONTAINER',function($class)use($dice){
返回$dice->create($class);
});
然后F3将使用Dice容器创建类,以便控制器及其任何依赖项将在构造函数中传递实例化的依赖项:

名称空间daos;
类别项目{
私有数据库\SQL$DB;
公共函数构造(DB\SQL$DB){
$this->db=$db;
}
公共函数fetchAll(){
$entries=$this->db->exec(…);
…
}
}

有关如何配置依赖项容器的完整示例,请参见。

$f3->set('DB',new\DB\SQL(…);
$f3->get('DB')
您需要的地方..对于真正的DI,…您可以使用任何与PSR-11兼容的DI容器..您只需将其classname设置为容器变量..这里有更多细节:好的,在解决路由时保持简单:第一个问题是仅在没有DB连接的情况下才需要“DB”(以前的连接遗留下来)所以,在包含/注入之前,最好是:$f3->route('GET/',function($f3){$f3->GET('DB');'Cons::struct'});还是在Cons的u construct()方法中获取'DB';我只是想确保连接确实是必要的(没有过去的持久性)。所以,也许上述方法确实是可行的(最简单、安全的)使用PDO参数设置:ATTR_PERSISTENT=>FALSE?//主控制器:$f3->route('GET/yoo',function($f3){$connection=$f3->call('f3pdo::getInstance')->connect();echo'
;$result=$connection->exec('SELECT*FROM MyDBTable');//…etc});或者更好地使用实体类的beforeRoute(){*->connect