Basic Usage
This guide shows you how to send SMS messages using the SMS Client library.
Quick Start
The simplest way to send an SMS is using the ProviderFactory:
use ByJG\SmsClient\Message;
use ByJG\SmsClient\Provider\ProviderFactory;
use ByJG\SmsClient\Provider\TwilioMessagingProvider;
use ByJG\Util\Uri;
// Register the provider
ProviderFactory::registerProvider(TwilioMessagingProvider::class);
// Create a provider instance
$provider = ProviderFactory::create(new Uri("twilio://$accountSid:$authToken@default"));
// Send a message
$response = $provider->send(
"+12221234567",
(new Message("This is a test message"))->withSender("+12223217654")
);
// Check if sent
if ($response->isSent()) {
echo "Message sent successfully!";
} else {
echo "Failed to send message.";
}
Using ProviderFactory::createAndSend()
For even simpler usage, you can use the createAndSend() method:
use ByJG\SmsClient\Message;
use ByJG\SmsClient\Provider\ProviderFactory;
use ByJG\SmsClient\Provider\TwilioMessagingProvider;
// Register the provider
ProviderFactory::registerProvider(TwilioMessagingProvider::class);
// Register service with country prefix
ProviderFactory::registerServices("twilio://accountId:authToken@default", "+1");
// Send message - provider is selected automatically based on phone number
$response = ProviderFactory::createAndSend(
"+12221234567",
(new Message("This is a test message"))->withSender("+12223217654")
);
Sending in Parallel
sendAsync(string|Phone $to, Message $envelope) returns a ByJG\WebRequest\HttpPromise (see
byjg/webrequest) fulfilled with
the ReturnObject, or rejected with the error: it does not throw. The HTTP providers (byjg, twilio,
twilio_verify) send in parallel while the promises are awaited:
use ByJG\WebRequest\HttpPromise;
$message = (new Message("Your order has shipped"))->withSender("+12223217654");
$results = HttpPromise::all(
...array_map(fn($phone) => ProviderFactory::createAndSendAsync($phone, $message), $phones)
)->await(); // the ReturnObject of each phone, in the same order
For a long list, HttpPromise::all() would open every connection at once and could exceed the provider's rate limit
(HTTP 429). HttpPromise::map() keeps at most a number of messages in progress:
$results = HttpPromise::map(
$phones,
fn($phone) => ProviderFactory::createAndSendAsync($phone, $message),
10 // at most 10 messages in progress
)->await(); // the ReturnObject of each phone, in the same order
ProviderFactory::createAndSendAsync() selects the provider as createAndSend() does. A provider that only
implements send() (e.g. fakesender, or a custom one) sends at once and returns a promise that is already settled.
Multi-Provider Setup
You can register multiple providers for different countries:
use ByJG\SmsClient\Provider\ProviderFactory;
use ByJG\SmsClient\Provider\TwilioMessagingProvider;
use ByJG\SmsClient\Provider\ByJGSmsProvider;
// Register providers
ProviderFactory::registerProvider(TwilioMessagingProvider::class);
ProviderFactory::registerProvider(ByJGSmsProvider::class);
// Associate providers with country codes
ProviderFactory::registerServices("twilio://accountId:authToken@default", "+1");
ProviderFactory::registerServices("byjg://username:password@default", "+55");
// US number uses Twilio
$response = ProviderFactory::createAndSend(
"+12221234567",
new Message("Hello from USA!")
);
// Brazilian number uses ByJG
$response = ProviderFactory::createAndSend(
"+5521900001234",
new Message("Olá do Brasil!")
);
Message Options
The Message class supports various options:
use ByJG\SmsClient\Message;
$message = new Message("Your message text here");
// Set sender phone number
$message->withSender("+12223217654");
// Add custom properties
$message->withProperty("custom_key", "custom_value");
// Set multiple properties at once
$message->withProperties([
'key1' => 'value1',
'key2' => 'value2'
]);
// Get properties
$body = $message->getBody();
$sender = $message->getSender();
$properties = $message->getProperties();
$customValue = $message->getProperty('custom_key', 'default_value');
Message Creation Methods
You can create messages in multiple ways:
use ByJG\SmsClient\Message;
// Using constructor
$message = new Message("Message text");
// Using static create method
$message = Message::create("Message text");
// Chaining methods
$message = Message::create("Message text")
->withSender("+12223217654")
->withProperty("priority", "high");