如何从 Silex 中的自定义文件/类连接到数据库


How to connect to database from custom files/classes in Silex

我是第一次尝试这个迷你框架,这是我第一次使用 justa 一个框架:)
我将教义服务添加到我的索引.php文件中,如下所示:

$app->register(new Silex'Provider'DoctrineServiceProvider(), array(
    'db.options' => array(
        'driver'   => 'pdo_sqlite',
        'path'     => __DIR__.'/../include/database.sqlite',
    ),
));

例如,我创建了一个带有静态方法的类的新文件,该静态方法可以重新转换数组。

<?php
namespace MyNameSpace;

class myClass{
    static function getStuff(){

       return array(1 => array('foo'=> 'bar',
                               'bar' => 'foo',
                              )
                   );
    }
}

如您所见,它是硬编码的,所以我决定使用数据库(sqlite 就足够了),但我不知道如何访问文件中$app变量。

另一方面,我能在网上找到的所有教程都令人困惑,并引用了带有 .phar 文件的旧 Silex 版本,该文件现已弃用,并且我找到的所有示例的目录结构都与我的不同(取自胖的 Silex zip 文件)

我的项目的目录结构是这样的:

├── composer.json
├── composer.lock
├── src
│   └── MyNameSpace
│       └── myClass.php
├── vendor
│   └── composer
│   └── doctrine
│   └── silex
│   └── ...
│   └── **autoload.php**
└── web
    └── css
    └── img
    └── js
    └── views
    └── .htaccess
    └── index.php
您需要

知道的第一件事是访问$app是一种不好的做法。如果可能,您应该DI。如果您确实想这样做,请检查下面的代码。

内部index.php(通常bootstrap.php)声明一个新服务:

$app['my_class'] = $app->share(function() use ($app) {
    // Retrieve the db instance and create an instance of myClass
    return new 'MyNameSpace'myClass($app['db']);
});

添加一个构造函数 sur myClass

namespace MyNameSpace;
class myClass
{
    /**
     * The connection
     *
     * @var 'Doctrine'DBAL'Connection
     */
    private $db;
    /**
     * Constructor
     *
     * @param $db 'Doctrine'DBAL'Connection
     */
    public function __construct($db)
    {
        $this->db = $db;
    }
    // ...
}

然后,您可以检索myClass的完全初始化实例,如下所示:

$myClass = $app['my_class'];