【问题标题】:SLIM3 - Accessing Database container in own ClassSLIM3 - 在自己的类中访问数据库容器
【发布时间】:2018-09-22 09:58:01
【问题描述】:

我正在我的 Slim 3 应用程序中编写自己的类。我想有一个自己的类来处理数据库查询。代码如下所示:

<?php
class DatabaseOperator { 

    private $dbconnection;
    function __construct($dbconnection) {
        $this->dbconnection = $dbconnection;
    }

    public function getUserPermissions($user_id) {
        $user_permissions = "SELECT list_id FROM permissions WHERE user_id='$user_id'";
        $sth = $dbconnection->prepare($user_permissions);
        $sth->execute();
        $user_permissions_result = $sth->fetchAll();
        $result_permissions = array();
        foreach ($user_permissions_result as $row) {
            $list_id = $row['list_id'];
            $this->logger->info("User has access to List ID: " . $list_id);
            array_push($result_permissions, $list_id);
        }
        return $result_permissions;
    }

    public function getUserID($username) {
        $sqluser = "SELECT user_id FROM users WHERE username='$username'";
        // TODO: Android REG_ID from DB
        $sth = $dbconnection->prepare($sqluser);
        $sth->execute();
        $res = $sth->fetch(PDO::FETCH_ASSOC);
        return $res['user_id'];
    }
}
?>

在我的 routes.php 中我得到了这样的东西:

$app->get('/login', function (Request $request, Response $response, array $args) {
  $username = $request->getServerParam('PHP_AUTH_USER');
    if (isset($username)) {
      $this->logger->info("Authenticated user: " . $username);
      $databaseOperator = new DatabaseOperator($this->db);
      $user_id = $databaseOperator->getUserID($username);

但是访问路由给了我这个错误:

由于以下错误,应用程序无法运行:
在 null
上调用成员函数 prepare() 文件:/var/www/vhosts/hosting114426.a2f69.netcup.net/httpdocs/rememberly/classes/DatabaseOperator.php 行:25
跟踪getUserID('testuser')

所以 $dbconnection 为空似乎存在问题。但是如果我在我的 routes.php 中使用$this-&gt;db-&gt;prepare(QUERY),它就可以正常工作。所以 $this->db 不为空。

那么这里的问题是什么?

【问题讨论】:

  • 访问类属性时需要使用$this-&gt;,就像在构造函数中设置它一样。将$dbconnection-&gt;prepare(...); 更改为$this-&gt;dbconnection-&gt;prepare(...);
  • 啊我的坏..它现在正在工作。但我问自己这是否是正确的方法。直接在类内部访问容器不是更容易,所以我不需要将容器传递给类构造函数吗?我在这里有点迷路,因为像$app-&gt;getContainer() 这样的东西在我的课堂上不起作用..
  • 在我看来,您当前的方法更好,因为它具有较少的依赖关系。如果你想为你的班级写一个测试,你需要做的就是发送一个新的数据库实例。否则,您还需要设置容器。

标签: php rest dependency-injection slim-3


【解决方案1】:
<?php
$slimSettings = [
/* ... */
];
$container = new \Slim\Container(['settings' => $slimSettings]);
$container['db'] = function ($c) {
    $dns = ''; // PDO dns
    $dbUser = ''; // database user
    $dbPass = ''; // database password
    return new \PDO($dns, $dbUser, $dbPass);
};

/* ... */
$app = new \Slim\App($container);
/* ... */
$app->get('/login', function (Request $request, Response $response, array $args) {
    $username = $request->getServerParam('PHP_AUTH_USER');
    if (isset($username)) {
        $this->logger->info("Authenticated user: " . $username);
        $databaseOperator = new DatabaseOperator($this->db);
        $user_id = $databaseOperator->getUserID($username);
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2017-07-24
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-07-08
    相关资源
    最近更新 更多