neighborhoods/buphalo

制造模式。


README

制造模式。

我们从别人那里偷来的好东西。坏的东西是我们自己的。

目录

摘要

本文件试图描述如何使用 Buphalo 的公共 API。此外,它试图提供一些对 Buphalo 尝试解决的问题及其动机的见解。如果本文件中没有描述,则不被视为公共 API,并可能在任何任意版本中更改,即您不应该依赖于它。

问题

模式是特定上下文中的问题解决方案。实现良好的模式可能变得繁琐且耗时,这阻碍了其实现,转而采用设计不佳但开发速度较快的模式。

解决方案

使用易于更改的代码生成工具,生成良好的模式,以便开发速度与设计不佳的模式相当或更快。

入门指南

运行 Buphalo

环境变量 API

跟踪代码中使用的环境变量非常容易。Buphalo 使用 DI 组件 的环境功能将运行时选项注入容器中的对象。

Buphalo 利用环境变量 API 进行运行时选项。以下运行 Buphalo 的 shell 命令说明了当前支持的 API。

Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__SourceDirectoryPath=/PATH/TO/SOURCE/DIRECTORY \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__FabricationDirectoryPath=/PATH/TO/FABRICATION/DIRECTORY \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__NamespacePrefix=VENDOR\\PRODUCT\\ \
Neighborhoods_Buphalo_V1_TemplateTree_Map_Builder_FactoryInterface__TemplateTreeDirectoryPaths=TreeName:/PATH/TO/TEMPLATE/TREE/DIRECTORY \
php bin/v1/buphalo

例如,为了运行 Buphalo(假设 Buphalo 已安装为 composer 依赖项),请在您的产品根目录中执行以下 shell 命令。

Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__SourceDirectoryPath=$PWD/vendor/neighborhoods/buphalo/src/v1 \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__FabricationDirectoryPath=$PWD/vendor/neighborhoods/buphalo/fab/v1 \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__NamespacePrefix=Neighborhoods\\Buphalo\\ \
Neighborhoods_Buphalo_V1_TemplateTree_Map_Builder_FactoryInterface__TemplateTreeDirectoryPaths=buphalo:$PWD/vendor/neighborhoods/buphalo/template-tree/V1 \
php vendor/bin/v1/buphalo
过滤

Buphalo 还允许您通过

Neighborhoods_Buphalo_V1_FabricationFile_Map_BuilderInterface__FinderFileNames

环境变量指定任何数量的特定过滤规则。作为环境变量,这是“类型”为 CSV。然后由 DI 组件 转换为数组,并最终注入到 Finder 组件的 \Symfony\Component\Finder\Finder::name 中。适用于 \Symfony\Component\Finder\Finder::name 的任何规则都适用于此处。

Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__SourceDirectoryPath=$PWD/vendor/neighborhoods/buphalo/src/v1 \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__FabricationDirectoryPath=$PWD/vendor/neighborhoods/buphalo/fab/v1 \
Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__NamespacePrefix=Neighborhoods\\Buphalo\\ \
Neighborhoods_Buphalo_V1_TemplateTree_Map_Builder_FactoryInterface__TemplateTreeDirectoryPaths=buphalo:$PWD/vendor/neighborhoods/buphalo/template-tree/V1 \
Neighborhoods_Buphalo_V1_FabricationFile_Map_BuilderInterface__FinderFileNames=Connection.buphalo.v1.fabrication.yml,Connection2.buphalo.v1.fabrication.yml 
php vendor/bin/v1/buphalo

示例制造文件

# This lives in /PATH/TO/SOFTWARE_PRODUCT_ROOT/src/V2/Toe.buphalo.v1.fabrication.yml

# I WANT ALL THE ACTORS!
actors:
  <PrimaryActorName>.php:
    template: PrimaryActorName.php
  <PrimaryActorName>.service.yml:
    template: PrimaryActorName.service.yml
  <PrimaryActorName>Interface.php:
    template: PrimaryActorNameInterface.php
  <PrimaryActorName>/AwareTrait.php:
    template: PrimaryActorName/AwareTrait.php
  <PrimaryActorName>/Factory.php:
    template: PrimaryActorName/Factory.php
  <PrimaryActorName>/Factory.service.yml:
    template: PrimaryActorName/Factory.service.yml
  <PrimaryActorName>/FactoryInterface.php:
    template: PrimaryActorName/FactoryInterface.php
  <PrimaryActorName>/Factory/AwareTrait.php:
    template: PrimaryActorName/Factory/AwareTrait.php
  <PrimaryActorName>/Builder.php:
    template: PrimaryActorName/Builder.php
  <PrimaryActorName>/Builder.service.yml:
    template: PrimaryActorName/Builder.service.yml
  <PrimaryActorName>/BuilderInterface.php:
    template: PrimaryActorName/BuilderInterface.php
  <PrimaryActorName>/Builder/AwareTrait.php:
    template: PrimaryActorName/Builder/AwareTrait.php
  <PrimaryActorName>/Builder/Factory.php:
    template: PrimaryActorName/Builder/Factory.php
  <PrimaryActorName>/Builder/Factory.service.yml:
    template: PrimaryActorName/Builder/Factory.service.yml
  <PrimaryActorName>/Builder/FactoryInterface.php:
    template: PrimaryActorName/Builder/FactoryInterface.php
  <PrimaryActorName>/Builder/Factory/AwareTrait.php:
    template: PrimaryActorName/Builder/Factory/AwareTrait.php
  <PrimaryActorName>/Repository.php:
    template: PrimaryActorName/Repository.php
  <PrimaryActorName>/Repository.service.yml:
    template: PrimaryActorName/Repository.service.yml
  <PrimaryActorName>/RepositoryInterface.php:
    template: PrimaryActorName/RepositoryInterface.php
  <PrimaryActorName>/Repository/AwareTrait.php:
    template: PrimaryActorName/Repository/AwareTrait.php
  <PrimaryActorName>/Map.php:
    template: PrimaryActorName/Map.php
  <PrimaryActorName>/Map.service.yml:
    template: PrimaryActorName/Map.service.yml
  <PrimaryActorName>/MapInterface.php:
    template: PrimaryActorName/MapInterface.php
  <PrimaryActorName>/Map/AwareTrait.php:
    template: PrimaryActorName/Map/AwareTrait.php
  <PrimaryActorName>/Map/Factory.php:
    template: PrimaryActorName/Map/Factory.php
  <PrimaryActorName>/Map/Factory.service.yml:
    template: PrimaryActorName/Map/Factory.service.yml
  <PrimaryActorName>/Map/FactoryInterface.php:
    template: PrimaryActorName/Map/FactoryInterface.php
  <PrimaryActorName>/Map/Factory/AwareTrait.php:
    template: PrimaryActorName/Map/Factory/AwareTrait.php
  <PrimaryActorName>/Map/Builder.php:
    template: PrimaryActorName/Map/Builder.php
  <PrimaryActorName>/Map/Builder.service.yml:
    template: PrimaryActorName/Map/Builder.service.yml
  <PrimaryActorName>/Map/BuilderInterface.php:
    template: PrimaryActorName/Map/BuilderInterface.php
  <PrimaryActorName>/Map/Builder/AwareTrait.php:
    template: PrimaryActorName/Map/Builder/AwareTrait.php
  <PrimaryActorName>/Map/Builder/Factory.php:
    template: PrimaryActorName/Map/Builder/Factory.php
  <PrimaryActorName>/Map/Builder/Factory.service.yml:
    template: PrimaryActorName/Map/Builder/Factory.service.yml
  <PrimaryActorName>/Map/Builder/FactoryInterface.php:
    template: PrimaryActorName/Map/Builder/FactoryInterface.php
  <PrimaryActorName>/Map/Builder/Factory/AwareTrait.php:
    template: PrimaryActorName/Map/Builder/Factory/AwareTrait.php
# This lives in /PATH/TO/SOFTWARE_PRODUCT_ROOT/src/V2/Toe/Nail.buphalo.v1.fabrication.yml

# I only want SOME actors!
actors:
  <PrimaryActorName>.php:
    template: PrimaryActorName.php
  <PrimaryActorName>.service.yml:
    template: PrimaryActorName.service.yml
  <PrimaryActorName>Interface.php:
    template: PrimaryActorNameInterface.php
  <PrimaryActorName>/AwareTrait.php:
    template: PrimaryActorName/AwareTrait.php
  <PrimaryActorName>/Factory.php:
    template: PrimaryActorName/Factory.php
  <PrimaryActorName>/Factory.service.yml:
    template: PrimaryActorName/Factory.service.yml
  <PrimaryActorName>/FactoryInterface.php:
    template: PrimaryActorName/FactoryInterface.php
  <PrimaryActorName>/Factory/AwareTrait.php:
    template: PrimaryActorName/Factory/AwareTrait.php
  <PrimaryActorName>/Builder.php:
    template: PrimaryActorName/Builder.php
  <PrimaryActorName>/Builder.service.yml:
    template: PrimaryActorName/Builder.service.yml
  <PrimaryActorName>/BuilderInterface.php:
    template: PrimaryActorName/BuilderInterface.php
  <PrimaryActorName>/Builder/AwareTrait.php:
    template: PrimaryActorName/Builder/AwareTrait.php
  <PrimaryActorName>/Builder/Factory.php:
    template: PrimaryActorName/Builder/Factory.php
  <PrimaryActorName>/Builder/Factory.service.yml:
    template: PrimaryActorName/Builder/Factory.service.yml
  <PrimaryActorName>/Builder/FactoryInterface.php:
    template: PrimaryActorName/Builder/FactoryInterface.php
  <PrimaryActorName>/Builder/Factory/AwareTrait.php:
    template: PrimaryActorName/Builder/Factory/AwareTrait.php

关闭演员的制造

  • 一开始就不包括演员条目在制造文件中。
  • 从制造文件中删除演员条目。
  • 从制造文件中注释掉演员条目。
  • 包括在 Neighborhoods_Buphalo_V1_TargetApplication_BuilderInterface__SourceDirectoryPath 指示的路径中引用的等效文件
    • Buphalo 不会在源目录路径中已存在的文件中制造文件,因为它们的想法是它们将优于制造的文件。

添加新模板或更新现有模板

  • 如果您还没有这样做,请将 Buphalo 的 template-tree 目录复制到您的软件产品根目录。
  • 在您的 template-tree/v1 目录下适当位置添加或更改相应的 PHP 和依赖注入服务定义 YAML 文件。
  • 请确保更新您的环境变量到以下(或您复制目录使用不同路径的等效项)
Neighborhoods_Buphalo_V1_TemplateTree_Map_Builder_FactoryInterface__TemplateTreeDirectoryPaths=TreeName:/PATH/TO/SOFTWARE_PRODUCT/ROOT/template-tree/v1 \

使用多个模板树

  • Buphalo 支持使用多个模板树。
  • 如果使用多个树,每个模板树必须通过在目录路径中包含“TreeName:”前缀来命名。
  • 如果使用单个模板树,模板树标识符可以选择不命名。
  • 使用逗号分隔每个路径标识符。
  • Buphalo将按指定顺序尝试查看模板树目录,并使用它找到的第一个匹配的模板。
  • 示例
Neighborhoods_Buphalo_V1_TemplateTree_Map_Builder_FactoryInterface__TemplateTreeDirectoryPaths=primary:/PATH/TO/SOFTWARE_PRODUCT/ROOT/template-tree/primary,secondary:/PATH/TO/SOFTWARE_PRODUCT/ROOT/template-tree/secondary \

定义

制造文件

  • 制造文件包含制造Fablet的说明。
  • Fablet的主要行为者通过制造文件文件名识别,以及Fabrication File在其所在目录结构中的位置。
  • <PrimaryActorName>令牌是对不带扩展名的制造文件名的别名,也是主要行为者的名称。
  • 示例制造文件部分,一个FabletToe,另一个FabletToe\Nail
  • Fablet行为者可以是任何东西。

Fablet

(来源 Mucha)

  • Fablet是从制造文件构建的行为者集合。
  • 主要行为者是与不带扩展名的制造文件名相同的类。
  • 这个集合包含主要行为者和/或任何数量的支持行为者。

功能

自动加载

  • 请确保更新您的composer.json以回退到fab目录,例如。
    "autoload": {
      "psr-4": {
        "VENDOR\\PRODUCT\\": [
          "src",
          "fab"
        ]
      }
    }
  • 为了高效,Buphalo将只制造在src中不存在的文件,因为src中的任何内容都将覆盖fab中的内容。

注解处理器

注解处理器(AP)是可选的配置工具,允许用户定义动态模板内容。

有关更多信息,请参阅AnnotationProcessors

参考