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);
}
在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);
}