melchiorkokernoot / laravel-autowire-config
允许通过自动装配的构造函数参数进行配置注入
Requires
- php: ^8.1
- illuminate/contracts: >=9.0
- illuminate/support: >=9.0
Requires (Dev)
- code050/codestyle: ^1.0
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: *
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-15 10:51:32 UTC
README
配置自动装配和注入
通过自动装配的构造函数参数启用 Laravel 配置注入。
class Foo { public function __construct( #[Config('app.name')] public string $myConfiguredAppName, ){} }
安装
您可以通过 composer 安装此包
composer require melchiorkokernoot/laravel-autowire-config
配置
该包将自动注册自己。您可以使用以下命令发布配置文件:
php artisan vendor:publish --provider="MelchiorKokernoot\LaravelAutowireConfig\LaravelAutowireConfigServiceProvider"
请注意,发布配置文件不是必需的,配置包也不是必需的。只有当您知道为什么要更改配置文件时,才需要更改配置文件。
这是发布配置文件的内容
return [ //Either AttributeStrategy::class or AutowiredPropNameStrategy::class 'strategy' => PropNameStrategy::class, ];
您可以选择两种策略
AttributeStrategy
: 使用属性注入配置值。PropNameStrategy
(默认): 使用构造函数提升的属性名称来注入配置值。
下面详细介绍这些策略。
使用
通过自定义应用类使用(推荐)
从版本 3.0.0 开始,该包可以通过自定义的 Application
类使用。这是推荐使用包的方式,因为它将提供更“自然”的使用方式。
要启用此行为,只需将 bootstrap/app.php 中的默认 Application
类替换为 MelchiorKokernoot\LaravelAutowireConfig\Application
类。
因此,将以下内容更改为以下内容:
$app = new Illuminate\Foundation\Application( $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__), );
更改为以下内容
use MelchiorKokernoot\LaravelAutowireConfig\Application; $app = new Application( $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__), );
使用自定义应用类的优点
- 允许将原始数据类型(int、float、bool、string)直接注入到构造函数中,而不需要默认值。不再需要将配置值包装在类型化配置类中!
- 允许在构造函数中使用只读属性
目前这仅适用于属性策略,但您不需要进行配置。一旦您开始使用新的 Application
类,包将自动禁用旧的使用方式,因此不会浪费资源在重复解析上。
为了说明这一点,让我们看一个例子
class Foo { public function __construct( #[Config('app.name','default value')] public string $myConfiguredAppName, ){} }
当从容器解析此 Foo
类时,包将自动解析 app.name
的配置值并将其注入到 $myConfiguredAppName
属性中。
通过服务提供者使用
从版本 2.0.0 开始,该包可以使用两种方式使用
通过属性自动装配(AttributeStrategy)使用
首先,在您的类上实现 AutowiresConfigs
接口。在构造函数中类型提示一个 类型化配置类,并将该类型提示用作属性,最后将配置键作为属性值传递。
class Foo implements AutowiresConfigs{ public function __construct( #[StringConfig('app.name')] public StringConfig $appName, ){} }
请注意,您现在不需要将变量命名为与配置键匹配,但您仍然需要类型提示配置类。
当从容器中使用此类(例如,通过依赖注入)时,配置值将像这样注入
$foo = new Foo(config('app.name'));
通过构造函数属性名称自动装配(PropNameStrategy)使用
首先,在您的类上实现 AutowiresConfigs
接口。在构造函数中类型提示一个 类型化配置类,并使用配置键的驼峰版本作为属性名称。
class Foo implements AutowiresConfigs{ public function __construct( public StringConfig $appName, ){} }
您需要将配置键与属性名匹配,所以
app.name
将变为appName
。
当从容器中使用此类(例如,通过依赖注入)时,配置值将像这样注入
$foo = new Foo(config('app.name'));
这种方法的优点在于,您可以保持应用程序逻辑与配置层之间的清晰分离。无需更多服务定位器,无需在代码中调用 config()
,只需干净的依赖项。
访问配置值
This way of access is only required when NOT using the custom Application strategy
由于配置值被封装在类型配置类中,您无法直接访问值。相反,您可以通过 value
方法访问值。为了方便,还实现了 __toString
魔术方法,因此您可以直接将配置值用作字符串(当然,对于可以转换为字符串的值)。
class Foo implements AutowiresConfigs{ public function __construct( public StringConfig $appName, ){} public function bar(){ //Casting to string (string) $this->appName //Shorthand method call $this->appName->value->v(); //Shorthand property access $this->appName->value->v; //Ordinary method call return $this->appName->value(); } }
类型化配置类
以下配置类可用:
ArrayConfig
BooleanConfig
IntegerConfig
NullableArrayConfig
NullableIntegerConfig
NullableStringConfig
StringConfig
陷阱
此包连接到 afterResolving 回调,这意味着它仅适用于通过容器解析的类。这意味着配置值将在调用构造函数之后填充,因此值在构造函数中不可用。
测试
composer test
路线图
- 在自定义
Application
类中使用时添加对原始类型的支持 - 在自定义
Application
类中使用时添加对只读属性的支持 - 添加配置值解包方式的选项(例如,禁用缩写
v()
)
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG。
贡献
有关详细信息,请参阅 CONTRIBUTING。
安全漏洞
有关报告安全漏洞的详细信息,请参阅 我们的安全策略。
致谢
许可
MIT 许可证(MIT)。有关更多信息,请参阅 许可文件。