如何从其他类访问Slim容器?

时间:2018-06-19 16:23:38

标签: slim

假设我在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()

1 个答案:

答案 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
});