Install the Bundle
Add to your composer.json:
"require": {
"avtonom/sms-sender-bundle": "^1.6"
}
Run composer update.
Enable the Bundle
Add to config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 2/3):
Avtonom\SmsSenderBundle\AvtonomSmsSenderBundle::class => ['all' => true],
Configure SMS Provider
Define your SMS provider in config/packages/avtonom_sms_sender.yaml (Symfony 4+) or app/config/config.yml (Symfony 2/3):
avtonom_sms_sender:
provider: 'your_provider' # e.g., 'clickatell', 'twilio', 'custom'
options:
api_key: '%env(SMS_API_KEY)%'
# Other provider-specific options
First Use Case: Send a Test SMS
Inject the SmsSender service and send a message:
use Avtonom\SmsSenderBundle\SmsSender;
class SomeController
{
public function sendTestSms(SmsSender $smsSender)
{
$smsSender->send([
'to' => '1234567890',
'message' => 'Hello from Laravel!',
]);
}
}
Provider Abstraction
Use the bundle’s SmsSender service to switch providers without changing business logic:
$smsSender->send([
'to' => 'recipient_number',
'message' => 'Your OTP is 1234',
'from' => 'YourBrand', // Optional sender ID
]);
Batch Sending Send SMS to multiple recipients efficiently:
$smsSender->sendBatch([
['to' => '1234567890', 'message' => 'Hello 1'],
['to' => '0987654321', 'message' => 'Hello 2'],
]);
Async Sending (Symfony Messenger) Integrate with Symfony Messenger for background processing:
# config/packages/messenger.yaml
framework:
messenger:
transports:
sms:
dsn: 'avtonom_sms_sender://'
routing:
'Avtonom\SmsSenderBundle\Message\SendSmsMessage': sms
Event Listeners
Hook into SMS lifecycle events (e.g., SmsSentEvent):
use Avtonom\SmsSenderBundle\Event\SmsSentEvent;
class SmsLoggerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
SmsSentEvent::class => 'logSms',
];
}
public function logSms(SmsSentEvent $event)
{
// Log or process sent SMS data
}
}
HttpKernel bridge to integrate with Laravel’s service container:
$kernel = new AppKernel('prod', false);
$container = $kernel->getContainer();
$smsSender = $container->get('avtonom_sms_sender.sms_sender');
use Libphonenumber\PhoneNumberUtil;
$phoneUtil = PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse('+1234567890');
if (!$phoneUtil->isValidNumber($number)) {
throw new \InvalidArgumentException('Invalid phone number');
}
avtonom_sms_sender:
providers:
primary: 'clickatell'
fallback: 'twilio'
Provider-Specific Quirks
username and password in options, not api_key.account_sid and auth_token.SmsSender library’s provider class is properly implemented (see SmsSender docs).Phone Number Formatting
+ and country code (e.g., +1234567890). Some providers (e.g., Twilio) may reject malformed numbers.Rate Limits
SmsSenderException gracefully:
try {
$smsSender->send([...]);
} catch (\Avtonom\SmsSender\Exception\SmsSenderException $e) {
$this->handleRateLimit($e);
}
Web Profiler Overhead
avtonom_sms_sender:
profiler: false
Enable Debug Mode
Add to config/packages/dev/avtonom_sms_sender.yaml:
avtonom_sms_sender:
debug: true
This logs raw API responses for troubleshooting.
Check Profiler Tab
The Web Profiler tab (/profiler) shows SMS sent/received data, including:
Log Provider Responses
Extend the SmsSender service to log raw responses:
use Psr\Log\LoggerInterface;
class CustomSmsSender extends \Avtonom\SmsSender\SmsSender
{
public function __construct(LoggerInterface $logger, array $providers)
{
parent::__construct($providers);
$this->logger = $logger;
}
protected function sendSms($message, $providerName)
{
$response = parent::sendSms($message, $providerName);
$this->logger->debug('SMS Response', ['provider' => $providerName, 'response' => $response]);
return $response;
}
}
Custom Providers
Implement a new provider by extending Avtonom\SmsSender\Provider\ProviderInterface:
class CustomProvider implements ProviderInterface
{
public function send(SmsMessage $message)
{
// Custom logic to send via your API
return new SmsResponse($success, $data);
}
}
Register it in config:
avtonom_sms_sender:
providers:
custom: 'App\Provider\CustomProvider'
Override Default Services
Use Symfony’s compiler pass or Laravel’s service binding to replace the default SmsSender:
// In a compiler pass or service provider
$container->set('avtonom_sms_sender.sms_sender', $this->createCustomSmsSender());
Add Metadata to SMS
Extend the SmsMessage class to include custom fields (e.g., campaign_id):
class ExtendedSmsMessage extends \Avtonom\SmsSender\SmsMessage
{
protected $campaignId;
public function setCampaignId($campaignId)
{
$this->campaignId = $campaignId;
return $this;
}
}
Update the provider to handle the new field.
How can I help you explore Laravel packages today?