繁体   English   中英

获取数据库实例的正确语法是什么?

[英]What is the proper syntax to get a db instance?

我使用雄辩的外部laravel。

这是负责它的文件:

class DbSql
{

    public function db()
    {
        $capsule = new Capsule;
        $capsule->addConnection( [
            'driver'    => Settings::DATABASE_DRIVER,
            'host'      => Settings::DATABASE_HOST,
            'database'  => Settings::DATABASE_NAME,
            'username'  => Settings::DATABASE_USERNAME,
            'password'  => Settings::DATABASE_PASSWORD,
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => ''
        ] );

        # Make this Capsule instance available globally
        $capsule->setAsGlobal();


        return $capsule;
    }

}

在控制器中,我实例化一次实例,并且可以在控制器中多次使用它:

    $dbInstance = ( new DbSql() )->db(); // Create the instance

    // Instance usages:
    $images = $dbInstance->table( 'images_attachments' )->where...
    $files = $dbInstance->table( 'files' )->where...
    .....

我应该实例化:

$dbInstance = ( new DbSql() )->db(); 如上面的代码

或者:

$dbInstance = ( new DbSql() )->db()->getConnection();

什么是正确的方法?

首先,不需要将Capsule (它是Illuminate\\Database\\Capsule\\Manager实例)包装在另一个类中,以便更容易地检索它。 事实上, Illuminate\\Database\\Capsule\\Manager提供了一个单例实例和简单的访问器。

一旦你打电话

$capsule->setAsGlobal();

通过Capsule::可以从任何地方静态访问Capsule实例。 这是因为引擎盖下的setAsGlobal()方法只是这样做:

static::$instance = $this;

将实例保存在静态类变量中,以便在后续调用Capsule::检索它。 因此,一旦调用setAsGlobal() ,就可以这样做,例如:

Capsule::select('select * from user');

并且您将在先前创建的连接上获得查询结果。

但是,您可以看到Manager (别名Capsule )类上不存在select方法。 它为什么有效? 因为Manager类会覆盖__callStatic() php magic方法

class Manager
{
    use CapsuleManagerTrait;

    // ...

    public static function __callStatic($method, $parameters)
    {
        return static::connection()->$method(...$parameters);
    }
}

因此,对select()方法的调用将自动重定向到基础\\Illuminate\\Database\\Connection实例。

这意味着:

  • 不需要将Manager / Capsule包装在外部类中,因为它已经是Connection类的包装器。 无需添加其他包装器。
  • 但是,如果您希望将其包装起来,我建议您返回Manager / Capsule实例而不是底层连接,因为文档中建议的方法是直接使用Manager

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM