Laravel 服务提供者和服务容器

Laravel Service provider and Service Container

在Laravel访问查询,我们使用DB门面

DB::select()

从 alanstorm 网站 http://alanstorm.com/binding_objects_as_laravel_services 我了解到 DB facade 使用 callstatic 导致 DB::app['db']->select() 的方法。 app 是 Laravel 服务容器对象,所有服务都绑定到它里面。我使用 var_dump PHP 方法 var_dump(app['db']) 并且我可以看到服务容器 returns 一个 Illuminate\Database\DatabaseManager 对象。来自 DatabaseManager class 实现 ConnectionResolverInterface。我没有看到那里定义的 select 方法。我想问一下 app['db'] 怎么才能访问到 select 方法。

DatabaseManager class 实现了 __call() 方法 如果你在 class 上调用一个不存在的方法,它会立即作为参数传递给 __call(),这是 php 的魔法之一 methods.

使用您传递的方法调用连接 class。

这里是Illuminate\Database\DatabaseManager

中的方法实现
/**
 * Dynamically pass methods to the default connection.
 *
 * @param  string  $method
 * @param  array   $parameters
 * @return mixed
 */
public function __call($method, $parameters)
{
    return $this->connection()->$method(...$parameters);
}