帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:Laravel  CQRS  ADA  适配器  bro  
Laravel adapter for Broadway.

  • 源代码名称:Laravel-broadway
  • 源代码网址:http://www.github.com/nWidart/Laravel-broadway
  • Laravel-broadway源代码文档
  • Laravel-broadway源代码下载
  • Git URL:
    git://www.github.com/nWidart/Laravel-broadway.git
  • Git Clone代码到本地:
    git clone http://www.github.com/nWidart/Laravel-broadway
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/nWidart/Laravel-broadway
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • Laravel 百老汇

    SensioLabsInsightScrutinizer Code QualityLatest Stable VersionTotal DownloadsLatest Unstable VersionLicense

    Laravel 百老汇是百老汇封装的适配器。

    它绑定了百老汇所有需要的接口。

    我已经构建了一个使用这个包和一些事件源技术的演示 Laravel 应用程序插件。

    Laravel 5兼容软件包

    Laravel 版本软件包版本
    ~4.2~0.2
    ~5.0~0.3
    ~5.1+~2.0

    安装

    通过composer安装

    
    composer require nwidart/laravel-broadway=~1.0
    
    
    
    

    服务提供商

    Laravel 5.5 ( 自动发现)

    如果你使用的是 Laravel 5.5,这个包提供自动发现,意味着你可以开始编码- 全局服务提供者。 如果你只需要一些服务提供商,请将以下部分添加到你的应用程序的composer.json 中:

    
    "extra": {
    
    
    "laravel": {
    
    
    "dont-discover": [
    
    
    "nWidart/Laravel-broadway"
    
    
     ]
    
    
     }
    
    
     }
    
    
    
    
    
    Laravel 5.4

    要完成安装,你需要添加服务提供者。

    你可以在这里选择,你可以使用将加载以下内容的主服务提供程序:

    或者选择仅使用所需的服务提供商。 不知道你需要什么? 使用提供的全局服务提供程序。

    全球服务提供商
    NwidartLaravelBroadwayLaravelBroadwayServiceProvider::class
    独立的服务提供商
    • CommandBus

      NwidartLaravelBroadwayBroadwayCommandServiceProvider::class
    • EventBus

      NwidartLaravelBroadwayBroadwayEventServiceProvider::class
    • 序列化程序

      NwidartLaravelBroadwayBroadwaySerializersServiceProvider::class
    • EventStorage

      NwidartLaravelBroadwayBroadwayEventStorageServiceProvider::class
    • ReadModel

      NwidartLaravelBroadwayBroadwayReadModelServiceProvider::class
    • MetadataEnricher

      NwidartLaravelBroadwayBroadwayMetadataEnricherServiceProvider::class
    • 支撑点

      NwidartLaravelBroadwayBroadwaySupportServiceProvider::class

    ( 可选) 发布配置文件和迁移

    
    php artisan vendor:publish
    
    
    
    

    这将发布一个 config/broadway.php 文件和 database/migrations/create_event_store_table.php 文件。

    ( 可选) 运行迁移

    最后一步,运行在最后一步中发布的迁移以创建event_store表。

    如果还没有发布供应商文件,则可以使用下面解释的命令:

    
    php artisan broadway:event-store:migrate table_name
    
    
    
    

    配置

    事件存储

    若要创建事件存储,可以调用以下命令:

    
    php artisan broadway:event-store:migrate table_name
    
    
    
    

    在配置文件中,可以选择要用作事件存储的驱动程序。

    'event-store'=> ['table'=>'event_store','driver'=>'dbal'],

    完成后,你可以在服务提供者中绑定你的英镑,例如:

    $this->app->bind(ModulesPartsRepositoriesEventStorePartRepository::class, function ($app) {$eventStore=$app[BroadwayEventStoreEventStore::class];$eventBus=$app[BroadwayEventHandlingEventBus::class];returnnewMysqlEventStorePartRepository($eventStore, $eventBus);});

    对于内存事件存储,你需要做的就是在配置文件中更改驱动程序,并添加一个新的事件存储库。

    读取模型

    若要在应用程序中设置读模型,首先需要在包配置中设置wanted读模型。

    完成上述操作后,你可以在服务提供者中绑定你的英镑,例如:

    $this->app->bind(ModulesPartsRepositoriesReadModelPartRepository', function ($app) { $serializer = $app[BroadwaySerializerSerializer::class]; return new ElasticSearchReadModelPartRepository($app['Elasticsearch'], $serializer);});

    以内存读取模型为例:

    $this->app->bind(ModulesPartsRepositoriesReadModelPartRepository::class, function ($app) {$serializer=$app[BroadwaySerializerSerializer::class];returnnewInMemoryReadModelPartRepository($app['Inmemory'], $serializer);});

    参见演示 Laravel 应用程序,特别是关于工作示例的服务提供者插件。

    注册订阅服务器

    命令处理程序

    为了让百老汇知道哪些处理器可用,你需要在 Laravel IoC容器中绑定一个名为 broadway.command-subscribers的键作为。

    了解Broadway中的命令处理程序类需要获取事件存储库库是很重要的。

    现在只需要将命令处理程序的一个 array 传递给 laravelbroadway.command.registry,或者只将IoC容器或者一个类传递给,就可以了:

    $partCommandHandler=newPartCommandHandler($this->app[ModulesPartsRepositoriesEventStorePartRepository::class]);$someOtherCommandHandler=newSomeOtherCommandHandler($this->app[ModulesThingsRepositoriesEventStoreSomeRepository::class]);$this->app['laravelbroadway.command.registry']->subscribe([$partCommandHandler,$someOtherCommandHandler]);// OR$this->app['laravelbroadway.command.registry']->subscribe($partCommandHandler);$this->app['laravelbroadway.command.registry']->subscribe($someOtherCommandHandler);

    事件订阅服务器

    这与命令处理程序相同,除了事件订阅者( 或者侦听器) 需要读取模型存储库。

    例如:

    $partsThatWereManfacturedProjector=newPartsThatWereManufacturedProjector($this->app[ModulesPartsRepositoriesReadModelPartRepository']);$someOtherProjector = new SomeOtherProjector($this->app['ModulesThingsRepositoriesReadModelSomeRepository']);$this->app['laravelbroadway.event.registry']->subscribe([ $partsThatWereManfacturedProjector, $someOtherProjector]);//OR$this->app['laravelbroadway.event.registry']->subscribe($partsThatWereManfacturedProjector);$this->app['laravelbroadway.event.registry']->subscribe($someOtherProjector);

    元数据 Enricher

    Broadways事件存储表带有一个名为"元数据"的字段。 这里我们可以存储所有应该与特定事件一起保存的东西,但是这不适用于。

    例如你想要存储当前登录的用户或者IP的ID。

    百老汇使用装饰器来操纵事件流。 decorator使用一个或者多个 Enrichers,它提供实际的数据( 用户 ID,IP )。 将事件保存到流之前,decorator将循环通过已经注册的enrichers并应用数据。

    下面的示例假设你添加了这个包的全局 ServiceProvider,或者至少 NwidartLaravelBroadwayBroadwayMetadataEnricherServiceProvider

    首先我们创建 enricher。 在本例中,假设我们对登录的用户有兴趣。 enricher将向元数据添加用户并返回修改后的元数据对象。 但是,在某些情况下- 如在单元测试中- 没有登录的用户。 为了解决这个问题,用户ID可以通过构造函数注入。

    // CreatorEnricher.phpclassCreatorEnricherimplementsMetadataEnricher{/** @var int $creatorId */private$creatorId;/** * The constructor * * @param int $creatorId*/publicfunction__construct($creatorId=null) {$this->creatorId=$creatorId; }/** * @param Metadata $metadata * @return Metadata*/publicfunctionenrich(Metadata$metadata) {if ($this->creatorId!==null) {$id=$this->creatorId; } else {$id=Auth::user()->id; }return$metadata->merge(Metadata::kv('createorId', $id)); }}

    其次,你需要将 Enricher register 到decorator并将decorator传递到你的存储库

    // YourServiceProvider.php/** * Register the Metadata enrichers*/privatefunctionregisterEnrichers(){$enricher=newCreatorEnricher();$this->app['laravelbroadway.enricher.registry']->subscribe([$enricher]);}$this->app->bind(ModulesPartsRepositoriesEventStorePartRepository::class, function ($app) {$eventStore=$app[BroadwayEventStoreEventStore::class];$eventBus=$app[BroadwayEventHandlingEventBus::class];$this->registerEnrichers();returnnewMysqlEventStorePartRepository($eventStore, $eventBus, $app[Connection::class], [$app[EventStreamDecorator::class]);});

    要检索元数据,你需要将DomainMessage作为 2nd 参数传递到你的投影仪中的apply*-method。

    // PartsThatWhereCreatedProjector.phppublicfunctionapplyPartWasRenamedEvent(PartWasRenamedEvent$event, DomainMessage$domainMessage){$metaData=$domainMessage->getMetadata()->serialize();$creator=User::find($metaData['creatorId']); // Do something with the user}

    所有剩下的都是百老汇包的惯例。

    变更日志

    许可证( MIT )



    文章标签:bro  Laravel  ADA  适配器  CQRS  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语