【问题标题】:Silex with Doctrine and PHP classes带有 Doctrine 和 PHP 类的 Silex
【发布时间】:2017-03-31 07:40:24
【问题描述】:

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

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

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

这样我就有能力对图像做一些事情了。但我不想这样工作。我希望类为我完成这一切,因此我只需编写一些方法来为我完成所有艰苦的工作。这样我就可以为 index.php 中的每个 Route 运行一行

问题是我不知道如何在课堂上与 Doctrine 建立联系。因为那里没有'$app'。我认为在类中启动应用程序会很奇怪。

假设我想创建一个用户类。这个 SQL 会给我所有的用户:“SELECT * FROM users”。但是如何在 User 类中使用 Doctrine?

<?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;
    }

}

【问题讨论】:

标签: php class doctrine silex


【解决方案1】:

在您的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;
}

【讨论】:

  • 啊,所以我只是将 $conn 实例提供给构造函数?
  • 正确!如果您使用全局变量方法,则只需在构造函数中传递该方法;如果您使用$app,那么您需要在实例化模型时从控制器传递它。喜欢:$myModelIns = new MyModelName($app['dbcon']);
  • 是的,我用的是最后一种方法!
  • 永远不要使用全局变量。而是从一个主配置 php 文件返回应用程序对象,并将该文件包含在每个其他文件中,以便可以通过 Pimple 访问服务。
【解决方案2】:

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

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

文档页面解释了您需要了解的所有内容,以实现您想要实现的目标。

【讨论】:

    猜你喜欢
    • 2017-01-13
    • 1970-01-01
    • 2011-01-31
    • 2015-06-13
    • 2017-03-17
    • 1970-01-01
    • 2012-10-28
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多