【问题标题】:Laravel Service provider and Service ContainerLaravel 服务提供者和服务容器
【发布时间】:2017-01-11 19:17:23
【问题描述】:

在 Laravel 中访问查询,我们使用DB facades

DB::select()

从alanstorm网站http://alanstorm.com/binding_objects_as_laravel_services我了解到DB门面使用callstatic方法导致DB::app['db']->select()app 是 Laravel 服务容器对象,所有服务都绑定到其中。我使用var_dump PHP 方法var_dump(app['db']) 可以看到服务容器返回一个Illuminate\Database\DatabaseManager 对象。来自实现ConnectionResolverInterfaceDatabaseManager 类。我没有看到那里定义的 select 方法。我想问一下app['db']如何访问select方法。

【问题讨论】:

标签: php laravel laravel-service-container


【解决方案1】:

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

用你传递的方法调用连接类。

这是 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);
}

【讨论】:

  • 感谢您,先生,我越来越清楚了,但我还有一个问题,当我 var_dump app['db']->connection() 它返回 mysqlconnection 对象时。在 databasemanager 类中有 $name 参数的连接方法。当我以前从未使用 mysql 类型设置 databasemanager 连接方法时,app['db']->connection() 如何返回 mysql 类型连接。谢谢你,先生
  • connection() 方法中,如果您没有传递名称,该方法将获取.env 文件或config/database.php 文件中指定的默认连接。在这种情况下 mysql 类型...深入挖掘源代码,您就会明白。
猜你喜欢
  • 2019-05-29
  • 2015-12-21
  • 1970-01-01
  • 2018-08-28
  • 2015-05-12
  • 2016-12-21
  • 2015-10-24
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多