全局数据库对象


Global database objects

我最近开始学习Laravel,我注意到DB对象是通过use传递的,允许在任何创建的方法中访问对象。我猜这是通过将数据库连接信息存储为静态属性或在内部引用变量来完成的。

现在,在我自己的(非laravel)代码中,我在每个页面上加载的文件中创建了一个PDO和MySQL对象,我最终通过global导入任何函数/方法,但我意识到这可能有点乏味。有更好的方法吗?我唯一能想到的是创建一个静态属性的对象,它是一个DB对象数组,以及一个返回它们的静态函数,这样我就可以将它们访问为DB::use('mysql')->query或其他什么。

laravel使用的是所谓的性状。它基本上是预处理器级别的复制-粘贴简写。是的,这些特定特征访问的变量是静态的(也称为"全局状态")。从本质上讲,laravel和您做的是一样的,但是有更多的语法糖。坏。

. .一个更好的方法。

嗯,你有三个基本的选择:

  • 使用工厂来共享多个对象之间的连接。因为我又懒又糟糕,你可以在我以前的回答中读到

  • 使用服务位置、注册表或单例(都是反模式的)

  • 使用一个叫做"依赖注入容器"或DI容器的系统

现在,那里有可用的DI容器,但我建议您查看两个选项,即Auryn和Symfony的DependencyInjection组件。它们都有很好的手册,但其中一个主要是基于反射的,另一个是基于配置的。

Auryn文档特别介绍了共享PDO实例作为一个例子。

现在,请记住,一般来说,DI容器是一种高级概念,我建议从尝试使用工厂开始。特别是当您对应用程序架构越来越熟悉时,您将遇到许多情况,其中工厂和DI容器的组合是最好的方法。

还有问题吗?

你应该研究的是自动加载。特别是顶部的名称空间称为PSR-4自动加载。这些都是在使用Laravel时使用composer生成的。你可以独立于Laravel运行composer。Laravel的创造者Jeffery Way比我更清楚地解释了PSR-4的自动加载功能。https://laracasts.com/lessons/psr-4-autoloading

这是关于使用composer进行上传的文档。https://getcomposer.org/doc/01-basic-usage.md半自动的