假设我在dependencies.php
文件中设置了此容器:
<?php
$container = $app->getContainer();
$container['db'] = function($config)
{
$db = $config['settings']['db'];
$pdo = new PDO("mysql:host=" . $db['host'] . ";port=" . $db['port'] .
";dbname=" . $db['dbname'] . ";charset=" . $db['charset'], $db['user'], $db['pass']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $pdo;
};
我可以在container
中使用这个route
,例如table.php
:
<?php
use Slim\Http\Request;
use Slim\Http\Response;
$app->get('/table/get_table', function (Request $request, Response $response, array $args)
{
$sql = $this->db->prepare("SELECT * FROM some_table");
$sql->execute();
$result = $sql->fetchAll();
return $response->withJson($result);
});
这基本上是默认用法,对吗?话虽如此,我该如何使用其他类中的db
容器呢?假设我创建了一个名为TableUtility
的类,并将其导入table.php
内:
class TableUtility
{
function GetTableFromDb()
{
$sql = $this->db->prepare("SELECT * FROM some_table");
$sql->execute();
$result = $sql->fetchAll();
return $response->withJson($result);
}
}
如您所见,我将PDO
的逻辑移到了GetTableFromDb
的{{1}}内,如何从此类访问TableUtility
容器?
db
中的用法将是:
table.php
实际上我进入<?php
use Slim\Http\Request;
use Slim\Http\Response;
$app->get('/table/get_table', function (Request $request, Response $response, array $args)
{
$tableUtility = new TableUtility();
return $response->withJson($tableUtility->GetTableFromDb());
});
:
在null上调用成员函数prepare()
答案 0 :(得分:3)
您称为container
的全名是Dependency Injection Container
。它应该包含对象的依赖关系。将此容器传递给对象被认为是不好的做法。相反,您应该只传递该对象的必需依赖关系,在您的情况下,是将db
传递给$tableUtility
。通常通过在构造对象时传递依赖项或使用setter方法来使用此方法。根据您的情况,您可以像这样重构代码:
class TableUtility
{
function __construct($db) {
$this->db = $db;
}
}
现在,在TableUtility
类的任何方法中,您都可以使用$this->db
访问db对象,但是无论何时创建新对象,都需要将db传递给类构造函数。因此,您还需要这样做:
$app->get('/table/get_table', function (Request $request, Response $response, array $args)
{
$tableUtility = new TableUtility($this->db);
// rest of the code
});