Skip to content

Commit 8e0e771

Browse files
committed
Merge pull request #3 from scaytrase/feature/transports
Spooling and special transports fix #1
2 parents 88540f2 + bccd599 commit 8e0e771

31 files changed

+1147
-208
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ composer.lock
77
target/
88
vendor/
99
bin/
10-
build/
10+
build/

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,4 +336,4 @@ This General Public License does not permit incorporating your program into
336336
proprietary programs. If your program is a subroutine library, you may
337337
consider it more useful to permit linking proprietary applications with the
338338
library. If this is what you want to do, use the GNU Lesser General
339-
Public License instead of this License.
339+
Public License instead of this License.

README.md

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
21
# scaytrase/symfony-sms-delivery-bundle
3-
[![Latest Stable Version](https://poser.pugx.org/scaytrase/symfony-sms-interface/v/stable.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface) [![Total Downloads](https://poser.pugx.org/scaytrase/symfony-sms-interface/downloads.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface) [![Latest Unstable Version](https://poser.pugx.org/scaytrase/symfony-sms-interface/v/unstable.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface) [![License](https://poser.pugx.org/scaytrase/symfony-sms-interface/license.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
2+
[![Latest Stable Version](https://poser.pugx.org/scaytrase/symfony-sms-interface/v/stable.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
3+
[![Total Downloads](https://poser.pugx.org/scaytrase/symfony-sms-interface/downloads.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
4+
[![Latest Unstable Version](https://poser.pugx.org/scaytrase/symfony-sms-interface/v/unstable.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
5+
[![License](https://poser.pugx.org/scaytrase/symfony-sms-interface/license.svg)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
46

57
[![Monthly Downloads](https://poser.pugx.org/scaytrase/symfony-sms-interface/d/monthly.png)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
68
[![Daily Downloads](https://poser.pugx.org/scaytrase/symfony-sms-interface/d/daily.png)](https://packagist.org/packages/scaytrase/symfony-sms-interface)
79

8-
This Symfony2 bundle provides basic service for sending short messages. This bundle does not provide you any finished implementation for communicating the SMS gateway. To use it you have use some transport implementation or implemenent a transport on your own. See [usage section](#Usage) for known implementations
10+
This Symfony bundle provides basic service for sending short messages. This bundle does not provide you any finished
11+
implementation for communicating the SMS gateway. To use it you have use some transport implementation or
12+
implement a transport on your own. See [usage section](#Usage) for known implementations
913

1014
## Features
1115

@@ -47,22 +51,50 @@ Below is the configuration example and their default values
4751

4852
```yaml
4953
sms_delivery:
54+
spool: sms_delivery.spool.instant
5055
transport: sms_delivery.dummy_sender # @id of the transport service
51-
disable_delivery: false # disables actual delivery making every send return successful result. use profiler to get message details
52-
delivery_recipient: null # when not null - sends every message to the specified recipient, ignoring actual recipient of the message.
56+
disable_delivery: false # disable delivery overrides spool with disabled spool
57+
delivery_recipient: null # delivery recipient overrides recipient when sending
5358
```
5459
5560
## Usage
5661
57-
To use this interface you must create a message class implementing ``ShortMessageInterface`` and implement a transport that delivers your message to end point sms gateway. You can refer my [WebSMS](https://github.com/scaytrase/symfony-websms-bundle) gateway implementation as a reference.
62+
To use this interface you must create a message class implementing ``ShortMessageInterface`` and create the implementation of the
63+
``TransportInterface`` that delivers your message to end point sms gateway.
64+
You can refer my [WebSMS](https://github.com/scaytrase/symfony-websms-bundle) gateway implementation as a reference.
5865
5966
6067
### Example
6168
62-
```php
69+
```php
70+
class MyMessage implements ShortMessageInterface { /*...*/ }
71+
72+
class SmsController extends Controller {
73+
6374
public function sendSmsAction(){
64-
$message = new YourMessage('5552368','Help!')
65-
$result = $this->get('sms_delivery.sender')->send($message);
66-
return new Response('Delivery '. $result ? 'successful' ; 'failed');
75+
$message = new MyMessage('5552368','Help!')
76+
$sender = $this->get('sms_delivery.sender');
77+
$sender->spoolMessage($message);
78+
$result = $sender->flush();
79+
return new Response('Delivery '. $result ? 'successful' : 'failed');
6780
}
6881
```
82+
83+
84+
### Standalone usage
85+
86+
Despite of the fact that this library is designed as Symfony bundle it could be used as standalone library for sending
87+
short messages. You should just instantiate sender service on your own.
88+
89+
```php
90+
91+
class MyProviderSmsTransport implements TransportInterface { /*...*/ }
92+
93+
class MyMessage implements ShortMessageInterface { /*...*/ }
94+
95+
$transport = new MyProviderSmsTransport();
96+
$sender = new MessageDeliveryService($transport);
97+
$sender->spoolMessage(new MyMessage('Message body'));
98+
$sender->flush(); // Default InstantSpool does not actually needs flushing but you can use another spool instead
99+
100+
```

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
"symfony/config": "~2.3"
1818
},
1919
"require-dev": {
20-
"phpunit/phpunit": "~4.6@stable"
20+
"phpunit/phpunit": "~4.6@stable",
21+
"symfony/framework-bundle": "~2.3"
2122
},
2223
"autoload": {
2324
"psr-0": {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: batanov.pavel
5+
* Date: 11.08.2015
6+
* Time: 14:59
7+
*/
8+
9+
namespace ScayTrase\SmsDeliveryBundle\Command;
10+
11+
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
12+
use Symfony\Component\Console\Input\InputInterface;
13+
use Symfony\Component\Console\Output\OutputInterface;
14+
15+
class FlushCommand extends ContainerAwareCommand
16+
{
17+
/**
18+
* Configures the current command.
19+
*/
20+
protected function configure()
21+
{
22+
$this->setName('scaytrase:sms_delivery:flush');
23+
$this->setDescription('Flush the delivery service message spool');
24+
}
25+
26+
27+
/**
28+
* {@inheritdoc}
29+
*/
30+
protected function execute(InputInterface $input, OutputInterface $output)
31+
{
32+
$sender = $this->getContainer()->get('sms_delivery.sender');
33+
34+
$sender->flush();
35+
}
36+
37+
}

src/ScayTrase/SmsDeliveryBundle/DataCollector/MessageDeliveryDataCollector.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
namespace ScayTrase\SmsDeliveryBundle\DataCollector;
1010

1111
use ScayTrase\SmsDeliveryBundle\Service\MessageDeliveryService;
12+
use ScayTrase\SmsDeliveryBundle\Spool\Package;
1213
use Symfony\Component\HttpFoundation\Request;
1314
use Symfony\Component\HttpFoundation\Response;
1415
use Symfony\Component\HttpKernel\DataCollector\DataCollector;
@@ -53,6 +54,7 @@ public function getName()
5354
return 'sms_delivery.data_collector';
5455
}
5556

57+
/** @return Package[] */
5658
public function getData()
5759
{
5860
return $this->data;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: batanov.pavel
5+
* Date: 21.07.2015
6+
* Time: 16:26
7+
*/
8+
9+
namespace ScayTrase\SmsDeliveryBundle\DependencyInjection\Compiler;
10+
11+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
12+
use Symfony\Component\DependencyInjection\ContainerBuilder;
13+
14+
class SpoolCompilerPass implements CompilerPassInterface
15+
{
16+
17+
/**
18+
* You can modify the container here before it is dumped to PHP code.
19+
*
20+
* @param ContainerBuilder $container
21+
*
22+
* @api
23+
*/
24+
public function process(ContainerBuilder $container)
25+
{
26+
if (!$container->hasDefinition('sms_delivery.sender')) {
27+
return;
28+
}
29+
30+
$sender = $container->getDefinition('sms_delivery.sender');
31+
32+
if (
33+
$container->hasParameter('sms_delivery.disable_delivery') &&
34+
$container->getParameter('sms_delivery.disable_delivery') === true &&
35+
$container->hasDefinition('sms_delivery.spool.disabled')
36+
) {
37+
$sender->replaceArgument(1, $container->getDefinition('sms_delivery.spool.disabled'));
38+
} else {
39+
$spool = $container->getDefinition($container->getParameter('sms_delivery.spool'));
40+
$sender->replaceArgument(1, $spool);
41+
}
42+
}
43+
}

src/ScayTrase/SmsDeliveryBundle/DependencyInjection/Compiler/TransportCompilerPass.php

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1212
use Symfony\Component\DependencyInjection\ContainerBuilder;
13+
use Symfony\Component\DependencyInjection\Definition;
1314

1415
class TransportCompilerPass implements CompilerPassInterface
1516
{
@@ -23,9 +24,27 @@ class TransportCompilerPass implements CompilerPassInterface
2324
*/
2425
public function process(ContainerBuilder $container)
2526
{
26-
$container->getDefinition('sms_delivery.sender')->replaceArgument(
27-
0,
28-
$container->getDefinition($container->getParameter('sms_delivery.transport'))
29-
);
27+
if (!$container->hasDefinition('sms_delivery.sender')) {
28+
return;
29+
}
30+
31+
$sender = $container->getDefinition('sms_delivery.sender');
32+
33+
$transport = $container->getDefinition($container->getParameter('sms_delivery.transport'));
34+
if (
35+
$container->hasParameter('sms_delivery.delivery_recipient') &&
36+
$container->getParameter('sms_delivery.delivery_recipient') !== null
37+
) {
38+
$overrideTransport = new Definition('ScayTrase\SmsDeliveryBundle\Transport\OverrideRecipientTransport');
39+
$overrideTransport->setArguments(
40+
array(
41+
$transport,
42+
$container->getParameter('sms_delivery.delivery_recipient')
43+
)
44+
);
45+
$sender->replaceArgument(0, $overrideTransport);
46+
} else {
47+
$sender->replaceArgument(0, $transport);
48+
}
3049
}
3150
}

src/ScayTrase/SmsDeliveryBundle/DependencyInjection/Configuration.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@ public function getConfigTreeBuilder()
2424

2525
$disable_delivery = (new BooleanNodeDefinition('disable_delivery'));
2626
$delivery_recipient = (new ScalarNodeDefinition('delivery_recipient'));
27-
$sender = (new ScalarNodeDefinition('transport'));
27+
$transport = (new ScalarNodeDefinition('transport'));
28+
$spool = (new ScalarNodeDefinition('spool'));
2829

2930
$rootNode
3031
->children()
31-
->append($sender->defaultValue('sms_delivery.dummy_sender')->info('Sender transport service'))
32+
->append($spool->defaultValue('sms_delivery.spool.instant')->info('Sender message spool'))
33+
->append($transport->defaultValue('sms_delivery.transport.dummy')->info('Sender transport service'))
3234
->append($disable_delivery->defaultFalse()->info('Disables actual delivery for testing purposes'))
3335
->append($delivery_recipient->defaultNull()->info('Recipient for messages for testing purposes'))
3436
->end();
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: batanov.pavel
5+
* Date: 12.08.2015
6+
* Time: 10:31
7+
*/
8+
9+
namespace ScayTrase\SmsDeliveryBundle\EventListener;
10+
11+
use Psr\Log\LoggerInterface;
12+
use ScayTrase\SmsDeliveryBundle\Service\MessageDeliveryService;
13+
use ScayTrase\SmsDeliveryBundle\Spool\MemorySpool;
14+
use Symfony\Component\Console\ConsoleEvents;
15+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
16+
use Symfony\Component\HttpKernel\KernelEvents;
17+
18+
class MemorySpoolListener implements EventSubscriberInterface
19+
{
20+
/** @var MessageDeliveryService */
21+
private $sender;
22+
/** @var LoggerInterface */
23+
private $logger;
24+
25+
/**
26+
* Constructor.
27+
*
28+
* @param MessageDeliveryService $sender
29+
* @param LoggerInterface $logger A LoggerInterface instance
30+
*/
31+
public function __construct(MessageDeliveryService $sender, LoggerInterface $logger = null)
32+
{
33+
$this->sender = $sender;
34+
$this->logger = $logger;
35+
}
36+
37+
/** {@inheritdoc} */
38+
public static function getSubscribedEvents()
39+
{
40+
$listeners = array(KernelEvents::TERMINATE => 'onTerminate');
41+
42+
if (class_exists('Symfony\Component\Console\ConsoleEvents')) {
43+
$listeners[ConsoleEvents::TERMINATE] = 'onTerminate';
44+
}
45+
46+
return $listeners;
47+
}
48+
49+
public function onTerminate()
50+
{
51+
$spool = $this->sender->getSpool();
52+
53+
if ($spool instanceof MemorySpool) {
54+
try {
55+
$spool->flush();
56+
} catch (\Exception $exception) {
57+
if (null !== $this->logger) {
58+
$this->logger->error(sprintf('Exception occurred while flushing message queue: %s',
59+
$exception->getMessage()));
60+
}
61+
}
62+
}
63+
}
64+
}
Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,39 @@
11
parameters:
2-
sms_delivery.transport: sms_delivery.dummy_sender
2+
sms_delivery.transport: sms_delivery.transport.dummy
33
sms_delivery.disable_delivery: false
44
sms_delivery.delivery_recipient: null
5+
sms_delivery.spool: sms_delviery.spool.instant
56

67
services:
7-
sms_delivery.dummy_sender:
8+
sms_delivery.spool.instant:
9+
class: ScayTrase\SmsDeliveryBundle\Spool\InstantSpool
10+
11+
sms_delivery.spool.disabled:
12+
class: ScayTrase\SmsDeliveryBundle\Spool\DisabledSpool
13+
14+
sms_delivery.spool.memory:
15+
class: ScayTrase\SmsDeliveryBundle\Spool\MemorySpool
16+
17+
sms_delivery.transport.dummy:
818
class: ScayTrase\SmsDeliveryBundle\Transport\DummyTransport
919

1020
sms_delivery.sender:
1121
class: ScayTrase\SmsDeliveryBundle\Service\MessageDeliveryService
1222
arguments:
1323
- %sms_delivery.transport%
24+
- %sms_delivery.spool%
1425
- %sms_delivery.disable_delivery%
1526
- %sms_delivery.delivery_recipient%
1627

17-
data_collector.sms_delivery.data_collector:
28+
sms_delivery.data_collector:
1829
class: ScayTrase\SmsDeliveryBundle\DataCollector\MessageDeliveryDataCollector
1930
arguments:
2031
- @sms_delivery.sender
2132
tags:
2233
- { name: data_collector, template: "SmsDeliveryBundle:DataCollector:data_collector", id: "sms_delivery.data_collector" }
34+
35+
sms_delivery.event_listener.memory_spool_listener:
36+
class: ScayTrase\SmsDeliveryBundle\EventListener\MemorySpoolListener
37+
arguments: [ @sms_delivery.sender, @?logger ]
38+
tags:
39+
- { name: kernel.event_subscriber }

src/ScayTrase/SmsDeliveryBundle/Resources/views/DataCollector/data_collector.html.twig

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,22 @@
8080
<th scope="col">#</th>
8181
<th scope="col">Delivery Status</th>
8282
<th scope="col">Delivery Reason</th>
83-
<th scope="col">Delivery Transport</th>
83+
{#<th scope="col">Delivery Transport</th>#}
8484
<th scope="col">Message Recipient</th>
8585
<th scope="col">Message Body</th>
86-
<th scope="col">Message Class</th>
86+
{#<th scope="col">Message Class</th>#}
8787
</tr>
8888
</thead>
8989
<tbody>
90-
{% for key,record in collector.data %}
90+
{% for key,package in collector.data %}
9191
<tr>
9292
<td>{{ key }}</td>
93-
<td>{{ record.status }}</td>
94-
<td>{{ record.reason }}</td>
95-
<td>{{ record.transport }}</td>
96-
<td>{{ record.message.recipient }}</td>
97-
<td>{{ record.message.body }}</td>
98-
<td>{{ record.message_class }}</td>
93+
<td>{{ package.status }}</td>
94+
<td>{{ package.reason }}</td>
95+
{#<td>{{ package.record.transport }}</td>#}
96+
<td>{{ package.record.message.recipient }}</td>
97+
<td>{{ package.message.body }}</td>
98+
{#<td>{{ package.message_class }}</td>#}
9999
</tr>
100100
{% endfor %}
101101
</tbody>

0 commit comments

Comments
 (0)