wearesho-team/yii2-message-delivery

Message Delivery Yii2 Implementation

2.2.0 2024-12-11 14:15 UTC

README

Test & Lint Latest Stable Version Total Downloads codecov

This repository includes RepositoryInterface implementation using Yii2 ActiveRecord

Installation

composer require wearesho-team/yii2-message-delivery:^1.8.0

Usage

Configuration

<?php
// common/config/main.php

use Wearesho\Delivery;

return [
    'bootstrap' => [
        Delivery\Yii2\Bootstrap::class, // registers migrations and configures container        
    ],
];

Queue

This package provides optional yii2-queue integration. To use it you have to install yii2-queue package:

composer require yiisoft/yii2-queue:^2.0

Then you may configure your application:

<?php
// common/config/main.php

use Wearesho\Delivery;

return [
    'bootstrap' => [
        [
            'class' => Delivery\Yii2\Bootstrap::class,
            'service' => [
                'class' => Delivery\Yii2\Queue\Service::class,
                'service' => Delivery\ServiceMock::class, // you your custom Delivery\ServiceInterface implementation
            ],
        ],
    ],
];

Note: messages sent using Queue\Service have to correct work with serialize() and unserialize(). See yii2-queue for details

Skipping queue while sending message

Sometimes there is need to send message without queue (for example during mass messaging in CLI environment). To skip queue service you need to create message with options (Delivery\MessageOptionsInterface):

<?php

use Wearesho\Delivery;

/** @var Delivery\Yii2\Queue\Service $service */
$message = new Delivery\MessageWithOptions(
    recipient: '380930000000',
    text: 'Message Text',
    options: [
        Delivery\Yii2\Queue\Service::OPTION_SYNC => true,  
    ]
);

$service->send($message); // message will be sent directly to sync service without queue job

SwitchService

You can configure few delivery services, and choose one of them using environment variable.

<?php

use Wearesho\Delivery;
use App;

$service = new Delivery\Yii2\SwitchService([
    'environmentKeyPrefix' => 'DELIVERY_', // by default,
    'services' => [
        'default' => [
            'class' => Delivery\ServiceMock::class,
        ],
        'production' => [
            'class' => App\Delivery\Service::class, // some Delivery\ServiceInterface implementation
        ],
    ],
]);

putenv('DELIVERY_SERVICE'); // clean environment
$message = new Delivery\Message('text', 'recipient');
$service->send($message); // default service will be used if no environment variable set
putenv('DELIVERY_SERVICE=production');
$service->send($message); // production service will be used if it was configured

RepositoryService

You can wrap any your service into RepositoryService, that has repository. If sending message in wrapped service did not throwed any exception message will be stored as sent.

<?php

use Wearesho\Delivery;
use App;

$service = new Delivery\Yii2\RepositoryService([
    'service' => App\CustomService::class,
    'repository' => Delivery\Yii2\Repository::class, // or your own implementation
]);

// do what you want using Delivery\ServiceInterface

Authors

License

MIT