Laravel 包设计见解

发布于 作者

Insights into Laravel package design image
Laravel 是一个极具影响力的 PHP 框架,其简单而强大的设计意味着您可以在应用程序中轻松使用包。在本博文中,我们将探讨创建和安装 Laravel 包的基础知识。

从哪里开始?

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 错误报告,以便洞悉错误并为您的用户修复错误。

Graham Campbell photo

知名的 PHP 开源开发人员和 StyleCI 创始人。

Cube

Laravel 新闻稿

加入 40,000 多位其他开发人员,永远不要错过新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成功能和对本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

毫不妥协

Joel 和 Aaron,两位来自 No Compromises 播客的资深开发者,现已可供您为您的 Laravel 项目聘用。 ⬧ 固定价格 7500 美元/月。 ⬧ 无冗长的销售流程。 ⬧ 无合同。 ⬧ 100%退款保证。

毫不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 2500 美元,即可为您的项目配备一名具有 4-6 年经验的资深 Laravel 开发人员。获得 160 小时的专业知识和 15 天的无风险试用。立即安排电话会议!

Bacancy
Lucky Media logo

Lucky Media

现在就来试试 Lucky - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,为 Laravel 带来了现代无头电子商务功能的强大功能。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、即用型组件、统计信息、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,帮助成功企业。

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成,增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包向您的 Laravel 应用程序添加评论

阅读文章