[英]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.