Silex with Doctrine 和 PHP 类

Silex with Doctrine and PHP classes

所以,我想在 Silex 中四处走走。只要了解它的工作方式,我就会尝试在其中使用 Doctrine。我可以在 index.php 上使用它,但我也想在我的 classes 上使用它。这些行用于普通根文件 (index.php):

$images = $app['db']->prepare("SELECT * FROM images");
$images->execute();

$images = $images->fetchAll(\PDO::FETCH_CLASS, \AI\Models\Image::class);

这样我就可以对图像进行处理。但我不想这样工作。我希望 classes 为我做这一切,所以我只需编写一些方法来为我完成所有艰苦的工作。这样我就可以 运行 为 index.php

中的每条路线写一行

问题是我不知道如何从我的 classes 内部连接 ​​Doctrine。因为那里没有“$app”。我认为在 class.

中启动应用程序会很奇怪

假设我想创建一个用户 class。这个 SQL 会给我所有的用户:"SELECT * FROM users"。但是我如何在用户内部使用 Doctrine class?

<?php

namespace Models;

class User {

    public function find($user){
        if($user) {
            $field = (is_numeric($user)) ? 'id' : 'username';

            $sql = "SELECT * FROM users";

            $data = // RUN QUERY $SQL 
            if($data->count()) {
                $this->_data = $data->all();
                return true;
            }
        }
        return false;
    }

}

您需要在控制器中注入这些实例。 我快速浏览了文档,认为我找到了您需要的内容。

这是文档页面的 link:http://silex.sensiolabs.org/doc/2.0/providers/service_controller.html

文档页面解释了实现目标所需了解的一切。

在您的 index.php 中按照以下步骤操作。

  • 创建 silex 应用程序的实例:

    $app = new Silex\Application();
    $app->register(new Silex\Provider\ServiceControllerServiceProvider());
    
  • 设置数据库配置:

    $config = new \Doctrine\DBAL\Configuration();
    $connParams = array(
        'driver'   => 'driver',
        'dbname'   => 'dbname',
        'host'     => 'host',
        'user'     => 'user',
        'password' => 'pass',
        'charset'  => 'charset',
        'port'     => 'port' 
    );
    
  • 连接到数据库:

    $conn = \Doctrine\DBAL\DriverManager::getConnection($connParams, $config);
    

现在您可以通过不同的方式使此数据库实例在整个应用程序中都可访问。您可以创建一个全局变量,在其中添加实例:

global $dbcon;
$dbcon = $conn;

或者简单地将其添加到 $app 本身:

$app['dbcon'] = $conn;

此外,您可能希望像这样向模型添加构造函数:

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