hostnet/entity-plugin-lib

Hostnet Doctrine 实体库的安装器

安装次数: 122,723

依赖关系: 4

建议者: 0

安全性: 0

星标: 8

关注者: 6

分支: 7

公开问题: 0

类型:composer-plugin

4.0.1 2024-06-06 07:35 UTC

README

问题

Hostnet 实体作曲插件是为了解决使用 Doctrine ORM 纯粹方式遇到的一些问题而开发的。虽然我们的解决方案灵感来源于与 doctrine 的合作,但它可以完美地用于其他任何持久化实体的方式。我们遇到的问题是:

  • 实体变得非常大;
  • 实体在应用程序之间共享,而这些应用程序继承了它们不允许使用的功能;
  • 如计算折扣等知识领域通过模型分散,而不是分组在一起;
  • 滥用继承来防止代码重复。

为了解决我们的问题,我们从软件开发的另一个领域借鉴了一些想法,因为我们感觉我们正在触及面向对象编程的边界,并寻求更多的模块化。我们使用了面向方面编程背后的想法来解决我们的问题。

基本概念:实体按职责分组到包中。此插件将包链接在一起。

如果你:

  • 维护一个包含实体且希望人们可以在此基础上进行扩展的开源项目。
  • 你有一个数据库,以及多个应用程序访问该数据库的不同(但相关)的子集。
  • 或者正在寻找自己连接某些东西。

如果你不属于上述任何一组,请小心,因为这可能不是你想要的。

示例

一个应用程序需要了解Clients,但不知道Contract的概念。另一个应用程序需要访问这两个实体。所以在一个应用程序中,你希望能够调用$client->getContracts()。但在另一个中,你更喜欢根本不知道合同的存在!

使用此插件,你可以创建一个专注于Client的包,另一个专注于Contract的包,并为此注入额外的功能(如getContracts)到Client中。

用法

创建可扩展的包

  • 创建一个 composer 包来存放你的实体。
  • 使用 PSR-0 或 PSR-4 自动加载 src/ 目录。
  • 包的类型应为 hostnet-entity
  • 包应要求 "hostnet/entity-plugin-lib": "2.*"。
  • 在以 Entity 结尾的命名空间内创建一个实体,例如 Page
  • 运行 php composer.phar dump-autoload。 (实体插件会钩住此事件。)这应该会输出一些内容
Pass 1/3: Generating compound traits and interfaces
Pass 2/3: Preparing individual generation
Pass 3/3: Performing individual generation
  • 从你的实体中,使用在 Generated/ 命名空间中生成的 trait。
    use \Hostnet\Page\Entity\Generated\PageTraits;

恭喜,你现在有一个可扩展的实体包。

扩展包

按照上述步骤操作,并

  • 确保你的新包依赖于旧包。
  • 不要创建 Page 类,而是创建一个 PageTrait
  • 运行 php composer.phar update
  • 检查 vendor/your-vendor-name/your-package-name/src/Entity/Generated/PageTraits.php。它应该包含对您的包的引用。

提示

如果您使用 -v-vv-vvv 运行 composer.phar,它将显示更多信息。

如果您想从主应用程序扩展实体,您可以在 composer.json 的 extra 部分中使用 entity-bundle-dir 设置。

如果您不想生成接口,可以在composer.json的额外设置中将generate-interfaces设置项设置为false。我们将在未来的版本中将此设置为默认行为。

为了快速了解,请查看速查表