Slim 框架,无法从控制器到达容器内的 pdo sql 服务器连接

Slim framework, cannot reach pdo sql server connection that is inside a container from a controller

在我的 app.php 中,我设置了一个容器,用于配置数据库连接:

    $container['db'] = function ($c) {
    $db = $c['settings']['db'];
    $pdo = new PDO("sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'], $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT));
    return $pdo;
};

并指定路由和控制器相关信息:

$container['CourseController'] = function($container)
{
    return new \App\Controllers\CourseController($container);
};

require __DIR__ . '/../app/routes.php';

在我的routes.php中,我只有一条路线:

<?php

$app->get('/courses', 'CourseController:getAll');

及以下是我的 Controller.php 和课程Controller.php 类:

<?php

namespace App\Controllers;

class Controller
{
    protected $container;

    public function __construct($container)
    {
        $this->container = $container;        
    }

}

<?php

namespace App\Controllers;

class CourseController extends Controller
{
    public function getAll($request, $response)
    {
        try
        {
            $statement = $this->container->db->prepare("SELECT * FROM Course");
            $statement->execute();

            $results = $statement->fetchAll(PDO::FETCH_ASSOC);

            $response->getBody()->write(json_encode($results));
            return $response;
        }
        catch(PDOException $e)
        {
            print $e->getMessage();
        }

    }
}

我收到 500 错误并且无法找到问题所在。这是我目前所知道的:

有没有一种方法可以让我使用容器将我的 pdo 连接正确地传递到我的控制器,而不是获得 500?如果这不可能,我也愿意接受其他解决方案。

500 错误表示发生了 PHP 错误。

首先更改您的 PDO 实例化以启用错误:

$pdo = new PDO(
    "sqlsrv:Server=" . $db['host'] . ";Database=" . $db['dbname'],
    $db['user'],
    $db['pass'],
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);

要直接查看错误,请更新您的 Slim 设置以启用错误显示:

$config = [
    'settings' => [
        'displayErrorDetails' => true,
    ],
];
$app = new Slim\App();

您现在应该会看到显示的错误。或者查看 PHP 错误日志,您应该会在那里看到它。

你得到 500 是因为在你的 CourseController.php 文件中,PHP 试图在 App\Controllers 命名空间下找到 PDO class。

您必须使用前导反斜杠来指示 PDO 是全局的 class:

$results = $statement->fetchAll(\PDO::FETCH_ASSOC);