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

Kre*_*ker 2 php doctrine silex

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

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

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

<?php

namespace MyNameSpace;


class myClass{

    static function getStuff(){


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

    }

}
Run Code Online (Sandbox Code Playgroud)

你可以看到它是硬编码所以我决定使用数据库(sqlite是应该的),但我不知道如何访问我的文件中的$ app变量.

另一方面,我在网上找到的所有教程都让人感到困惑,并提到旧的Silex版本的.phar文件现在已被弃用,我发现的所有示例的目录结构都与我的不同(取自胖子) Silex zip文件)

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

??? composer.json
??? composer.lock
??? src
?   ??? MyNameSpace
?       ??? myClass.php
??? vendor
?   ??? composer
?   ??? doctrine
?   ??? silex
?   ??? ...
?   ??? **autoload.php**
??? web
    ??? css
    ??? img
    ??? js
    ??? views
    ??? .htaccess
    ??? index.php
Run Code Online (Sandbox Code Playgroud)

Flo*_*ent 6

您需要知道的第一件事是访问$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']);
});
Run Code Online (Sandbox Code Playgroud)

添加构造函数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;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

$myClass = $app['my_class'];
Run Code Online (Sandbox Code Playgroud)

  • 请阅读我的答案.这是正确的方法. (2认同)