hampel/envroute

基于路由的 Laravel 环境定制包

2.0.0 2024-05-08 01:52 UTC

This package is auto-updated.

Last update: 2024-09-08 02:30:47 UTC


README

Latest Version on Packagist Total Downloads Open Issues License

Simon Hampel 编写。

此包为 Laravel v5.x|v6.x|v7.x 提供基于路由的环境检测和配置 - 旨在用于开发环境,以测试使用 Laravel 作为测试框架的包。

这不仅适用于开发 Laravel 特定的包 - 任何类型的包都可以使用这个环境进行测试,Laravel 只是提供了一个方便的测试框架,使我们在开发过程中更容易测试我们的包。

关于

此包假设您有多个独立的包(可能依赖于 Laravel,也可能不依赖于 Laravel),您在本地进行开发,并且您有一个单独的 Laravel 框架安装,您使用它作为测试框架来测试您的包,这超出了单元测试的范围。

您的包安装在哪里无关紧要 - 我已经开始在我的 Laravel 根目录下的 /packages 目录中放置我的包,但每个包的 EnvRoute 配置可以设置为处理任何位置。

另一个假设是您希望能够自动加载要工作的特定包,而不会自动加载您可能正在工作的其他无关包。

这是 Laravel 4.x Workbench 的一个限制,因为它总是自动加载 Workbench 中的每个包,这有时会导致不一致或不希望的行为 - 尤其是当您有依赖于相同包的不同版本的包时。

例如,假设您开发了 PackageA,它依赖于 PackageX v1.1.*,并且您还开发了 PackageB,它也依赖于 PackageX,但需要 v2.0.*

在 Workbench 中,您会运行 composer update 以生成每个包依赖的自动加载文件。但是,因为所有包的供应商自动加载文件都被自动加载,所以发生的情况是 PackageX v1.1.* 被首先自动加载(因为它在搜索时首先找到),而 PackageX v2.0.* 在测试 PackageB 时永远不会可用。绕过这个问题的唯一方法是测试 PackageB 之前从 PackageA 中删除 vendor 文件夹,这很麻烦 - 尤其是如果您忘记了,微妙的包依赖差异会导致您花费时间诊断的意外结果。

EnvRoute 通过允许您选择性地自动加载所需的依赖,然后设置自定义的环境配置来测试,从而解决了这个问题。

安装

安装 EnvRoute 包的推荐方法是通过 Composer

:::bash
composer require "hampel/envroute"

或者手动在您的 composer.json 中定义它

:::json
{
    "require": {
        "hampel/envroute": "^1.0"
    }
}

运行 Composer 更新新要求。

:::bash
$ composer update

您需要通过编辑应用程序引导文件来用此包提供的 Http Kernel 替换默认的 Http Kernel。编辑 bootstrap/app.php,删除或注释掉 App\Http\Kernel 的单例加载,并用 EnvRoute\Http\Kernel 替换它。

:::php
//$app->singleton(
//	Illuminate\Contracts\Http\Kernel::class,
//	App\Http\Kernel::class
//);

$app->singleton(
	Illuminate\Contracts\Http\Kernel::class,
	EnvRoute\Http\Kernel::class
);

EnvRoute 的 Http Kernel 扩展了默认的 Http Kernel,因此基础框架的任何未来更新都不应该引起任何问题。

注意 - 不要更改 Laravel 框架的命名空间 - 此包假设基本类将在默认的 App 命名空间中找到。

接下来,发布 EnvRoute 配置

:::bash
$ php artisan vendor:publish --provider="EnvRoute\EnvRouteServiceProvider"

按照使用部分中的说明配置 EnvRoute 以与您的包一起使用。

使用方法

路由

EnvRoute 包改变了默认的环境检测机制。

目的是为每个正在开发的包创建一个路由前缀,然后你可以为该包配置一个独特的环境。例如 - 你可以为每个包创建一个独特的数据库连接。

首先,在你的 routes/web.php 文件中为你的包创建一个路由组

:::php
Route::prefix('test')->group(function() {

	Route::get('/', function () {
		// exercise your package at /test
	});

	Route::get('foo', function () {
		// exercise your package at /test/foo
	});
});

接下来,针对我们的 test 路由前缀,创建一个以路由前缀命名的 .env 文件 - 在这个例子中,我们的 .env 文件将命名为 .env.test。然后你可以配置这个 .env 文件,其中包含任何该包特有的设置,这些设置将在你访问以 /test 开头的 URL 时加载。

重要 - 你还必须在你的 .env 文件中设置 APP_ENV 变量,使其与路由前缀匹配。

APP_NAME="My Test Package"
APP_ENV=test

这是非常重要的,因为 APP_ENV 变量将决定 EnvRoute 服务提供程序将自动加载哪些包。

自动加载

要设置包文件的自动加载,编辑 config/envroute.php 配置文件,添加你的包的路径。包列表是一个数组,每个键对应于我们在上一步设置的每个环境路由。

:::php
'packages' => [

	'test' => [
		'path' => base_path() . '/packages/test',
	],

],

在上面的例子中,我们有一个名为 'test' 的包(这不必与我们要测试的实际包名称相对应 - 但它必须与路由前缀名称相匹配)。我们定义我们的测试路由前缀为 /test,一个相应的环境文件 .env.test,以及 APP_ENV 值为 test

我们的配置告诉自动加载器,'test' 包正在 /packages/test 文件夹中开发,一旦我们在这个文件夹中运行 composer update 来加载所有包依赖项并创建自动加载文件,我们的包就准备好进行测试了。

服务提供者

如果你的包有需要加载的 Laravel 服务提供者,请将它们添加到配置中的 providers 数组键。例如

:::php
'packages' => [

	'test' => [
		'path' => base_path() . '/packages/test',

		'providers' => [
			'Test\TestServiceProvider',
		],
	],
],

请注意,这不仅仅限于你的包自己的服务提供者 - 如果你的包(或测试框架)依赖于任何其他服务提供者,而这些服务提供者还没有被基础框架加载,也应该添加到提供者数组中。

别名

如果你的包有一个需要加载的别名(外观),请将其添加到配置中的 aliases 数组键。例如

:::php
'packages' => [

	'test' => [
		'path' => base_path() . '/packages/test',

		'providers' => [
			'Test\TestServiceProvider',
		],
		
		'aliases' => [
			'Test' => 'Test\Facades\Test',
		]
	],
],