esensi/loaders

Esensi 缺少的包 loaders

v3.0.0 2024-01-10 13:20 UTC

README

版本 1

一个 [Esensi\Loaders] 包,由 SiteRocket Labs® 编码。

Esensi/Loaders 使用 PHP 特性 来补充 Laravel 缺少的命名空间配置和别名加载器。使用特性可以实现高度的代码重用和可扩展性。虽然这个包提供了一个合理的基服务提供者,但开发人员可以自由地将特性混合到任何需要使用命名空间加载器的类中。使用合约,开发人员可以确信代码符合可靠的接口。(有关这些特性的内部工作原理的更多详细信息,请查看慷慨注释的源代码!)

注意

这个 Esensi/Activity 特别设计为与 Laravel 框架 兼容,可能不作为独立依赖项或作为其他框架的一部分兼容。

快速入门

使用 Composer 安装包

composer require esensi/loaders

开始使用这些新特性非常简单,只需扩展随 Esensi/Loaders 包一起提供的抽象 ServiceProvider 类。这个类已经实现了两个加载器特性,并可以快速进行自定义。虽然以下示例可以完成任务,但请参考包的代码以获取更多自定义选项

<?php namespace App\Providers;

use Esensi\Loaders\Providers\ServiceProvider;

class PackageServiceProvider extends ServiceProvider {

    /**
     * The namespace of the loaded config files.
     *
     * @var string
     */
    protected $namespace = 'vendor/package';

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $namespace = $this->getNamespace();

        // Load the configs first
        $this->loadConfigsFrom(__DIR__ . '/../../config', $namespace, $this->publish);

        // Optionally use Laravel 8's methods for loading views and language files
        $this->loadViewsFrom(__DIR__ . '/../../resources/views', $namespace);
        $this->loadTranslationsFrom(__DIR__ . '/../../resources/lang', $namespace);

        // Optionally load custom aliases out of the configs
        $this->loadAliasesFrom(config_path($namespace), $namespace);
    }

}

目录

帮助编写更好的文档: 文档仍在进行中。您可以通过作为拉取请求贡献更好的文档来帮助他人学习重用代码。

配置加载器

技巧: 此包包含一个使用此特性的抽象 ServiceProvider。包开发者应考虑扩展 Esensi\Loaders\Providers\ServiceProvider 并自定义 boot() 方法。

ConfigLoader 是一个特性,包开发者可能会发现它非常有用,可以将旧 Laravel 4 命名空间配置重新带到 Laravel 8 中。随着转向 Laravel 8,内部配置加载器被简化,以利用单级深度的配置结构。这使得包开发者难以提供易于加载且不与其他本地配置冲突的可发布配置。解决方案包括文件前缀(例如:config('vendor-package.foo'))或合并所有配置变量到一个文件中(例如:config('vendor.package.foo'))。Esensi 开发团队对旧方法非常满意,因此我们决定通过特性恢复命名空间功能(例如:vendor/package::foo)。

为了为应用程序提供命名空间配置,只需在任意ServiceProvider类上使用ConfigLoader特性,并在类的boot方法中调用loadConfigsFrom方法。默认情况下,这将使在指定路径下找到的配置可用于发布,使用php artisan vendor:publish --tag="config"(需要额外的ConfigPublisher特性)(请参阅ConfigPublisher特性)。然后特性将发布的配置叠加在包的原始配置之上,并在Laravel应用程序的配置仓库中设置。

<?php namespace App\Providers;

use Esensi\Loaders\Contracts\ConfigLoader as ConfigLoaderContract;
use Esensi\Loaders\Traits\ConfigLoader;
use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider implements ConfigLoaderContract {

    /**
     * Load namespaced config files.
     *
     * @see Esensi\Loaders\Contracts\ConfigLoader
     */
    use ConfigLoader;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->loadConfigsFrom(__DIR__ . '/../../config', 'vendor/package');
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

    }
}

小贴士:当与ConfigPublisher特性一起使用时,loadConfigsFrom方法的可选第三个参数允许包开发者选择开启或关闭配置发布。可选的第四个参数也允许自定义配置发布的标签。请参阅Esensi\Loaders\Contracts\ConfigLoader以获取更多详细信息。

YAML 加载器

小贴士:此包包含一个抽象的YamlServiceProvider,它使用此特性。包开发者应考虑扩展Esensi\Loaders\Providers\YamlServiceProvider并自定义boot方法。

YamlLoader是一个与ConfigLoader非常相似的特性,只不过它不是解析PHP配置文件,而是解析YAML配置文件。喜欢使用YAML格式配置其包的包开发者可以使用此特性在Laravel的配置仓库中加载所有YAML配置文件。此外,它可以与ConfigPublisher特性混合使用,以便将包的YAML配置发布到Laravel项目的命名空间配置路径。

为了为应用程序提供命名空间YAML配置,只需在任意ServiceProvider类上使用YamlLoader特性,并在类的boot方法中调用loadYamlFrom方法。默认情况下,这将使在指定路径下找到的YAML配置可用于发布,使用php artisan vendor:publish --tag="yaml"(需要额外的ConfigPublisher特性)。然后特性将发布的配置叠加在包的原始配置之上,并在Laravel 8的配置仓库中设置。新配置可通过config('vendor/package::foo')访问,就像在Laravel 4中一样。

<?php namespace App\Providers;

use Esensi\Loaders\Contracts\YamlLoader as YamlLoaderContract;
use Esensi\Loaders\Traits\YamlLoader;
use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider implements YamlLoaderContract {

    /**
     * Load namespaced YAML files.
     *
     * @see Esensi\Loaders\Contracts\YamlLoader
     */
    use YamlLoader;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->loadYamlFrom(__DIR__ . '/../../config', 'vendor/package');
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

    }
}

别名加载器

技巧: 此包包含一个使用此特性的抽象 ServiceProvider。包开发者应考虑扩展 Esensi\Loaders\Providers\ServiceProvider 并自定义 boot() 方法。

AliasLoader是一个包开发者可能会发现有用的特性,可以将Facades和其他服务定位器或类绑定到应用程序的自动加载空间。从某种意义上讲,这就是Laravel的容器通过在依赖注入中类型提示接口所做的事情。当调用接口时,它会映射或别名到一个具体实现。使用此特性所做的类似操作,但不在应用程序的容器内进行,而是使用PHP的本地class_alias方法。

此特性允许为包可能使用的任何较长的命名空间类创建快捷方式。它还可以允许开发者为实际不存在(或可能尚未存在)的应用命名空间类(例如:App\Foo\Bar)创建别名,而实际存在的则是供应商包类(例如:Foo\Bar\Class)。将别名存储在配置文件中允许开发者快速更换不同的实例。如果应用命名空间类确实存在,则可以直接删除别名:别名实际上是占位符。

为了向应用提供这些别名,只需在任意ServiceProvider类上使用AliasLoader特性,并在类的boot()方法中调用loadAliasesFrom()方法。默认情况下,这将在指定的路径中扫描配置文件,并将别名映射到aliases配置行上设置的类。这些别名随后可供应用中的其他类使用。

<?php namespace App\Providers;

use Esensi\Loaders\Contracts\AliasLoader as AliasLoaderContract;
use Esensi\Loaders\Traits\AliasLoader;
use Illuminate\Support\ServiceProvider;

class PackageServiceProvider extends ServiceProvider implements AliasLoaderContract {

    /**
     * Load namespaced aliases from the config files.
     *
     * @see Esensi\Loaders\Contracts\AliasLoader
     */
    use AliasLoader;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot()
    {
        $this->loadAliasesFrom(config_path('vendor/package'), 'vendor/package');
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

    }
}

小贴士:loadAliasesFrom()方法的可选第三个参数允许自定义查找aliases映射中键的值。有关详细信息,请参阅Esensi\Loaders\Contracts\AliasLoader

示例别名文件

与Laravel 8默认配置中包含的config/app.php文件类似,应将aliases键添加到任何需要注册别名的配置文件中。下面是一个示例配置文件

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Application aliases
    |--------------------------------------------------------------------------
    |
    | The following configuration options allow the developer to map shortcut
    | and placeholder aliases to concrete classes. These aliases should be
    | loaded by a service provider that uses the AliasLoader trait. If
    | the app actually makes use of a class by the same name as an
    | alias then simply comment out the alias here so that the
    | real class may be used instead.
    |
    */
    'aliases' => [

        // A shortcut alias for a namespaced class
        'User' => 'App\Models\User',

        // A shortcut alias for a Facade or service locator
        'Foo' => 'Vendor\Package\FooFacade',

        // A placeholder alias for a missing class
        'App\Foo\Bar' => 'Vendor\Package\Foo\Bar',
    ]
];

单元测试

注意:此包尚未提供测试覆盖率!这些单元测试不会很难编写,但我们想尽快发布此包。它们在我们的待办事项列表中!(或者,为什么等待?通过发送包含测试的pull request来更快地获得覆盖率。😉)

贡献

感谢您考虑为Esensi Core做出贡献!

许可

版权所有(c)2022 SiteRocket Labs

Esensi Core是开源软件,许可协议为MIT许可证