melchiorkokernoot/laravel-autowire-config

允许通过自动装配的构造函数参数进行配置注入

V4.0.5 2023-11-15 09:06 UTC

README

Banner

配置自动装配和注入

Latest Version on Packagist GitHub Tests Action Status Total Downloads

通过自动装配的构造函数参数启用 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)。有关更多信息,请参阅 许可文件