consolidation/bootstrap

定位并引导所需组件以便从框架中运行代码。

dev-main / 1.x-dev 2020-06-13 02:00 UTC

This package is auto-updated.

Last update: 2024-09-13 10:56:09 UTC


README

定位并引导所需组件以便从框架中运行代码。

Travis CI Scrutinizer Code Quality Coverage Status License

此组件设计为从命令行应用程序调用,例如 DrushDrupal Console。应用程序负责提供有关操作环境的基本信息,例如

  • 应用程序代码的位置。
  • 用户所选框架的位置(如果有的话)。
  • 其他用户提供的选项,如有必要(例如,在多站配置中应选择哪个特定站点)。

给定这些信息,此组件负责

  • 定位代码资源。
    • 命令行应用程序中的命令类。
    • 不同位置的全球插件命令类(例如,在用户的家目录中)。
    • 存储在框架中的特定站点插件命令类。
    • 模块和主题提供的命令类。
  • 识别用户所选的特定框架和主要版本。
  • 提供引导框架的机制。
    • 引导可以做到提供命令所需服务的级别。
      • 访问所选框架中的代码(包括自动加载器)。
      • 访问特定站点的设置(包括settings.php或等效设置)。
      • 访问站点的数据库。
      • 访问站点的配置。
      • 访问整个站点的运行时环境。
      • 访问登录用户。
    • 每个服务级别定义了需要哪些其他服务,并且它们按顺序引导。
    • 特定框架的引导类可以添加更多服务。
  • 提供过滤可用命令的机制。
    • 某些命令可能需要特定命令行应用程序的API。
    • 某些命令可能需要特定框架的API。
    • 某些命令可能需要特定Composer库的API,这些库可能由命令行应用程序或所选框架提供。

有关更多详细信息,请参阅下面的“引导过程”。

组件状态

开发中。

动机

通过提供一个共同的中心库来简化维护,并允许在框架之间更好地共享通用命令。例如,Drush的sql-*命令,通过调用SQL命令行工具运行,如果通用引导类提供所需的服务的通用引导类可以使用在其他上下文中。此组件旨在满足这一需求。

引导过程

通常,引导不是为正在运行的命令执行的,但有例外。

如果需要识别框架(在Drush中称为DRUSH_BOOTSTRAP_ROOT),则引导对象将自动引导到框架代码。这将允许框架提供自己的引导对象(如果需要)。

如果选定的命令不是引导感知的(通过实现BootstrapAwareInterface表示),则其引导级别将取决于命令的提供位置

  • 全局命令根本不引导。除非它们是引导感知的,否则它们无法访问所选站点。
  • 特定站点的命令引导到站点代码级别。
  • 模块提供的命令完全引导。

服务

支持Bootstrap的类可以向bootstrap对象请求服务。服务通过一个已知的标识符(字符串)进行请求;结果将是“未找到”或一个已知的接口,这取决于服务标识符。例如,上述SQL服务可能有一个服务标识符为'sql',并且可能返回一个实现SQLInterface的对象。

每种服务将由其自己的项目提供。

使用方法

$manager = new BootstrapManager();
$manager->add(new FrameworkBoot1());
$manager->add(new FrameworkBoot2());

$bootstrapObject = $manager->selectBootstrap('/path/to/framework/root');
$bootstrapObject->boot(['database']); // TODO: improve service feature specification

依赖注入

如果您的依赖注入容器支持词形变化,则可以使用该功能确保通过容器创建的任何支持Bootstrap的对象在选择了bootstrap对象后都会调用其setBootstrap方法。

以下示例显示了league/container的配置

$container->share('bootstrapCurrator', 'Consolidation\Bootstrap\BootstrapCurrator');
$container->share('bootstrapManager', 'Consolidation\Bootstrap\BootstrapManager')
    ->withMethodCall('setBootstrapCurrator', ['bootstrapCurrator']);
$container->inflector('Consolidation\Bootstrap\BootstrapAwareInterface')
    ->invokeMethod('setBootstrapCurrator', ['bootstrapCurrator']);

如果您不使用支持词形变化的容器,或者您不希望通过容器实例化所有支持Bootstrap的对象实例,那么您可以将您的工厂注册到bootstrap管理器中,它会确保在需要时注入bootstrap对象。请注意,为了使此功能正常工作,工厂必须提供监听器API,并在遇到可能需要设置的对象时通知bootstrap管理器。

$factory = new AnnotationCommandFactory();
$manager = new BootstrapManager();
$manager->registerFactory($factory);

与现有解决方案的比较

Drush有一个现有的Boot接口,与这里的需求非常相似。然而,此类与Drush紧密耦合;因此,这里的实现将略有不同。