梦游者/read-models-bundle

为 somnambulist/read-models 提供的 Symfony 集成

3.1.0 2024-03-03 02:03 UTC

This package is auto-updated.

Last update: 2024-09-03 02:56:42 UTC


README

GitHub Actions Build Status Issues License PHP Version Current Version

通过包将 read-models 集成到 Symfony 中。

安装

使用 composer 安装,或者从 github.com 检出/拉取文件。

  • composer require somnambulist/read-models-bundle
  • 将包类添加到 config/bundles.php 作为最后一个包
    • 注意:如果没有配置为最后一个,则任何自定义 doctrine 类型可能不会被分配给类型转换器,因为 Manager 将太早启动。
  • 添加一个配置文件(config/packages/somnambulist.yaml)包含配置
  • 通过 services.yaml 和标签映射任何自定义转换器
  • 创建一些模型
  • 加载数据: <model>::find()

config/packages/somnambulist.yaml 中的配置示例可能是

somnambulist_read_models:
    connections:
        'default': 'doctrine.dbal.default_connection'
        'App\Models\User': 'doctrine.dbal.user_connection'
    subscribers:
        request_manager_clearer: true
        messenger_manager_clearer: true

有 2 个事件订阅者会自动注册

  • 内核请求时清除身份映射,终止
  • 消息处理/失败时清除 messenger

如果 messenger 没有安装,监听器将自动禁用。

连接

每种模型类型都可以通过使用完全限定的类名作为键来具有自定义连接。当引用 Doctrine 连接时,确保如果从其他地方复制,不要留下 @ 前缀。

注意,如果没有指定默认值,则将自动注册当前配置的 Doctrine 默认值。

添加属性转换器

将属性转换器作为服务添加,并用 somnambulist.read_models.type_caster 标记它们,以便它们自动注册到 Manager 的属性转换器实例。

要使用 attribute-model 通用类型转换器,将它们作为服务添加并按需配置

services:
    app.type_casters.some_service_identity:
        class: Somnambulist\Components\AttributeModel\TypeCasters\ExternalIdentityCaster
        arguments:
            $providerAttribute: 'some_service_name' 
            $identityAttribute: 'some_service_id'
            $remove: true 
            $types:
                -
                    some_service_id
        tags: ['somnambulist.read_models.type_caster']

    app.type_casters.my_value_object:
        class: Somnambulist\Components\AttributeModel\TypeCasters\SimpleValueObjectCaster
        arguments:
            $class: 'App\\Entities\\SomeEntityValueObject' 
            $types:
                -
                    short_name
        tags: ['somnambulist.read_models.type_caster']

或者如果您不需要配置,或者有自己的配置;请使用资源

services:
    App\TypeCasters\:
        resource: '../../src/TypeCasters/'
        tags: ['somnambulist.read_models.type_caster']

属性名称应该是数据源中预期值出现的数组键名。例如:如果 Product 模型访问一个具有 unit_valueunit_cur 字段的 products 表,则可以使用 MoneyCaster 将其转换为 Money 对象。

services:
    app.type_casters.product_money_caster:
        class: Somnambulist\Components\AttributeModel\TypeCasters\MoneyCaster
        arguments:
            $amtAttribute: 'unit_value' 
            $curAttribute: 'unit_cur'
            $remove: true 
            $types:
                -
                    product_price
        tags: ['somnambulist.read_models.type_caster']

然后可以在 casts 中引用转换器: 'price' => 'product_price',并将 unit_value 和 unit_cur 属性替换为单个 "price" 属性,该属性将是一个 Money 值对象。如果应该保留原始值,请将 $remove 设置为 false

可以在任何时候添加额外的转换器;并且可以通过重用现有的类型名称来覆盖现有的转换器,尽管这被劝阻。请注意,一旦注册了类型,就无法删除。

使用方法

有关使用方法的详细信息,请参阅 read-models,有关属性转换器的更多信息,请参阅 attribute-models