php-arsenal/safe-salesforce-saver-bundle

允许您安全地将对象保存到Salesforce

3.0.0 2021-04-13 11:32 UTC

This package is auto-updated.

Last update: 2024-09-13 19:02:46 UTC


README

Release CI Packagist

关于

使用此包,您可以停止担心在尝试将信息保存到Salesforce时数据丢失的问题。SafeSalesforceSaver将接收您提供的对象并将它们放入队列中。当您决定一次性保存数百(甚至数千)个对象时,这些项目将逐个从队列中取出,以防止Salesforce过载。如果在保存过程中发生异常,Rabbit将稍后重试保存,同时记录错误,以便您可以调试问题。

安装

$ composer require php-arsenal/safe-salesforce-saver-bundle

根据您的Symfony版本,您可能需要在app/AppKernel.php中注册此包(Symfony 3.4及以下版本)

public function registerBundles()
{
    $bundles = [
        new PhpArsenal\SafeSalesforceSaverBundle\SafeSalesforceSaverBundle(),
    ];

    return $bundles;
}

或(Symfony 4.0及以上版本)在您的config/bundles.php

return [
     PhpArsenal\SafeSalesforceSaverBundle\SafeSalesforceSaverBundle::class => ['all' => true],
];

用法

要使此包正常工作,您必须在Rabbit客户端中启动队列。为此,您需要将以下配置添加到项目的config.yml中

old_sound_rabbit_mq:
    producers:
        sss_async_processor:
            class: PhpArsenal\SafeSalesforceSaverBundle\Producer\AsyncSfSaverProducer
            connection: default
            exchange_options:
                name: 'sss_async_queue'
                type: direct
    consumers:
        sss_async_processor:
            connection: default
            exchange_options:
                name: 'sss_async_queue'
                type: direct
            queue_options:
                name: 'sss_async_queue'
            qos_options:
                prefetch_size: 0
                prefetch_count: 1
                global: false
            callback: PhpArsenal\SafeSalesforceSaverBundle\Consumers\AsyncSfSaveConsumer
    rpc_clients:
        parallel:
            connection: default
            expect_serialized_response: false
    rpc_servers:
        safe_salesforce_saver_server:
            connection: default
            callback: PhpArsenal\SafeSalesforceSaverBundle\Consumers\SafeSalesforceSaverServer
            qos_options: { prefetch_size: 0, prefetch_count: 1, global: false }
            queue_options: { name: sss_rpc_queue, durable: true, auto_delete: false }

请确保您不要更改队列的名称,因为这可能会导致问题。上述配置假设您已经设置了默认的rabbitMQ配置。如果没有,请参阅GitHub上的rabbit包的readme文件

为了实际将对象保存到Salesforce,它们必须以正确的方式注解。请参阅GitHub上的mapper包

当您更新了配置和模型后,您可以通过两种不同的方式保存它们。同步或异步

<?php

use PhpArsenal\SafeSalesforceSaverBundle\Services\SafeSalesforceSaver;

class ObjectSaver
{
    /** @var SafeSalesforceSaver */
    private $safeSalesforceSaver;

    /**
     * @param SafeSalesforceSaver $safeSalesforceSaver
     */
    public function __construct(SafeSalesforceSaver $safeSalesforceSaver)
    {
        $this->safeSalesforceSaver = $safeSalesforceSaver;
    }

    // This way of saving will wait for the save result from Salesforce. This means that you can immediately access the newly inserted ID after Salesforce saved the record.
    public function saveSingle(Object $object): string
    {
        $this->safeSalesforceSaver->save($object);

        return $object->getId();
    }
    
    // This function lets you save multiple objects at once. Simply put all the objects you want to save in an array and pass it to the SafeSalesforceSaver. 
    public function saveMultiple(Object $object, Object $object2, Object $object3): array
    {
        $this->safeSalesforceSaver->save([$object, $object2, $object3]);

        return [$object->getId(), $object2->getId(), $object3->getId()];
    }

    // If you do not want to wait for the result you can simply put your object into the queue and continue with the rest of your code. This is recommended if you don't need the ID or if you don't need a confirmation that the save succeeded.
    public function aSyncSaveSingle(Object $object): void
    {
        $this->safeSalesforceSaver->aSyncSave($object);
    }

    // As with the other save function, it is also possible to save multiple objects to Salesforce at once without waiting for the response.
    public function aSyncSaveMultiple(Object $object, Object $object2, Object $object3): void
    {
        $this->safeSalesforceSaver->aSyncSave([$object, $object2, $object3]);
    }
}