Laravel 包设计见解
发布于 作者 Graham Campbell
从哪里开始?
Composer 在 PHP 世界中非常重要,Laravel 也不例外。Laravel 框架核心使用 Composer 指定其依赖项,默认情况下 Laravel 应用程序也是如此。考虑到这一点,我们的包使用 Composer 定义其依赖项,并通过 Composer 使用 Packagist 进行分发,这完全是自然的。
有关 Composer 和 Packagist 的介绍,您可能需要阅读本系列中的前两篇博文:使用 Composer 构建可维护的 PHP 应用程序 和 Packagist 和 PHP 生态系统
在本博文中,我们将通过示例构建一个小型包。您可以参考 此处的示例。
包的基本结构
从本质上讲,请记住 Laravel 包与任何其他 PHP 包实际上没有什么区别。大多数人从以下开始
- 自述文件 - README.md
- 许可文件 - LICENSE
- Composer 文件 - composer.json
- 一个 gitignore 文件 - .gitignore
- 您的代码文件夹 - src
因此,我们将编写一个简短的自述文件,选择一个许可证,添加一个基本的 composer.json 文件和一个 .gitignore 文件
我们已将我们的包命名为 foo-bar/example,并将源文件夹命名空间为 Foo\Bar\Example。
添加您的代码
接下来,我们将编写一个简短的类,该类将为我们提供随机的猫名!
Facades 和容器
我们的类可以在任何 PHP 项目中使用,无论是否使用 Laravel。如果我们想通过 Laravel 服务容器 或 Laravel facade 使其可用怎么办?
首先,我们添加一个服务提供者。这将 Foo\Bar\Example\Cats 的实例绑定到服务容器,并允许我们通过 app('example.cats') 访问它,并通过类型为 Foo\Bar\Example\Cats 的参数将其注入到类中。您的包用户可以注册此服务提供者以设置绑定。
您的 facade 意味着您的包用户现在可以调用
Foo\Bar\Example\Facades\Cat::generate()
或 Cat::generate()(如果已别名或导入)。
由于我们正在使用支持组件,因此我们将要求它
配置
假设我们想添加能够自定义生成器提供的猫名的功能?我们可以使用 Laravel 的配置功能来做到这一点。
首先,我们修改我们的代码以通过构造函数接收所需的名称。重要的是,我们应该这样做,而不是尝试从类内部读取配置,以避免将我们的类耦合到配置。我看到的一个常见错误是,不仅在不需要的地方进行耦合,而且更严重的是,假设全局配置函数可供使用。您不能假设这一点,除非您需要所有 laravel/framework,同样,您也不能假设 Config 是别名为 Illuminate/Support/Facades/Config,甚至假设 facade 已启用(在 Lumen 或其他自定义框架的情况下)。除非您知道该别名存在,否则不要编写“use Config;”。
因此,我们修改我们的构造函数
并编写一个包含猫名的配置文件
用户可以将此文件发布到他们的应用程序以输入其配置。实际上,没有必要将此文件放在包代码中的此确切位置,因为 Laravel 5 比 Laravel 4 灵活得多;但是,我认为这是一个很好的存放位置。
接下来,我们定义我们的服务提供者
这里发生了很多事情!让我们逐步了解一下。我们将从查看 register 函数的修改开始。由于我们的 Cats 类现在在构造函数中接受一个猫名数组,因此我们需要传递一个。我们从文件“cats.php”的条目“names”中读取配置。
我们的 boot 函数是将我们的配置文件注册到框架所需的。实际上,在调用全局 config_path 函数时是没问题的,因为我们只在知道容器是 Laravel 应用程序实例的情况下才会进入该代码分支,因此它一定是整个 Laravel 框架都在那里的情况。
还应该注意,在 PHP 中导入不存在的类是完全可以的。导入语句的唯一副作用是将长名称绑定到短名称。考虑到这一点,这确实意味着 PHP 不关心类是否存在,因为它不会尝试加载它。同样,在 check 的实例中,PHP 不会费心检查提供的类是否实际存在,因为实现似乎需要对对象执行反射。
测试
在我们结束之前,自然要快速看一下测试。
最广泛使用的框架是 PHPUnit。它可以全局安装或作为本地 Composer 依赖项添加。
我们引入 PHPUnit,并添加一个基本的配置文件
我们现在编写一些简单的测试来检查我们的 Cats 类是否按预期工作
我们可以运行我们的测试
结论
我们已经了解了如何编写一个简单的 Laravel 应用程序,其中包含配置、facade 和基本测试。现在,去构建一些很棒的东西吧!
您可以在此博文中找到 Laravel 示例 此处在 GitHub 上。
您是否正在监控您的 Laravel 应用程序以查找错误?试试 Bugsnag 的 Laravel 错误报告,以便洞悉错误并为您的用户修复错误。