我开始一个新的支持twig的slim项目,我想使用PDO作为数据库层,集成的方式是什么?还是只使用 GLOBAL $db?
谢谢。
我反对可变的全局变量。您可以使用简单的工厂方法返回您的连接:
function db() {
static $db = null;
if (null === $db)
$db = new PDO(...);
return $db;
}
如果您要处理更多此类问题,请考虑注册一个注册表(请参阅这个)。
关于可变全局变量:
我反对这样的事情,因为,嗯,它们很容易被变异。
如果在程序运行过程中情况发生意外变化,会发生什么情况?
事情破裂。
如果您是该项目的唯一工作人员,则全局变量可能没问题。
但是根据我的经验,即使在这种情况下,跟踪全局变量也会变得很麻烦,并且会影响代码的逻辑组织。
如果您要与将覆盖此类全局的其他人共享您的代码怎么办?
所有这些都涉及到软件架构这一大而广泛的科学。
此外,在这种特定情况下使用工厂可确保您只保留一个对数据库连接的引用。
看这个项目:Slim-PDO (github)
文档在这里
通过作曲家安装:
$ composer require slim/pdo
简单用法:
$app->container->singleton('database', function () use ($app) {
return new \Slim\PDO\Database($app->config('db.dsn'), $app->config('db.usr'), $app->config('db.pwd'));
});
// SELECT * FROM users WHERE id = ?
$selectStatement = $app->database->select()
->from('users')
->where('id', '=', 1234);
$stmt = $selectStatement->execute();
$data = $stmt->fetch();
// INSERT INTO users ( id , usr , pwd ) VALUES ( ? , ? , ? )
$insertStatement = $app->database->insert(array('id', 'usr', 'pwd'))
->into('users')
->values(array(1234, 'your_username', 'your_password'));
$insertId = $insertStatement->execute(false);