In the previous article, we learned How to create Laravel Facade and how it can help to simplify our code and make it more accessible and beautiful.
In this article, we will see how we can control our SMS Provider/Gateway via configuration without even touching the code and changing it from the environment directly.
Use Case
Imagine you have two SMS Providers called ABC and XYZ that you are using in our application. But you need to switch it over time. But the trick is, you do not want to change your code when you change to another SMS service provider. Just like when you change any driver in a Laravel App like Log, Cache, Queue, Database, etc.
So let’s figure out how to do that.
Solution
Create SMS Service Contract
Create an SMS Service contract interface that contains the method to send the SMS.
Create a class app/Services/Contracts/SMSServiceContract.php with the following content,
The purpose of this class is, every SMS Service should implement this interface and it should have at least one method sendSMS with the same parameters.
Create SMS Service Implementations
The second step is to create the real implementation of our SMS Services which will be responsible for sending the SMS.
So as we have two SMS services, we will create two classes,
ABC SMS Service
Create a class app/Services/ABCSMSService.php with the following content,
XYZ SMS Service
Create a class app/Services/XYZSMSService.php with the following content,
Create Facade to Send SMS
The third step is to create a Facade to send an SMS. Create a facade class app/Facades/SMSGateway.php with the following content,
Here, note that we are giving SMSServiceContract class name as a facade assessor. So we will need to use that same class name while binding it to the real implementation in our service provider.
Define SMS Driver in config
We need to define our SMS Driver into our config file. You can create a new config file or can use config/services.php. To keep it simple, we will define it in services.php. I will add the following content at the end of the file before the closing bracket. so it will look like something,
Define your driver in .env file
Update your .env file and add SMS_SERVICE variable, something like
SMS_SERVICE=abc
Create/Modify Service Provider
The final step here is, we need to either create our own service provider and add it to config/app.php or we can use AppServiceProvider.php as well. To keep it simple let’s add it to AppServiceProvider.
In app/Providers/AppServiceProvider.php we will add the following code under the register method,
$this->app->bind(SMSServiceContract::class,
function ($app)
{
if (config('services.sms') == 'abc')
{
return new ABCSMSService();
} else {
return new XYZSMSService();
}
});
Note: Do not forget to import all these classes at the top.
And that’s it.
Usage
Now you can use your Facade to send the SMS.
\App\Facades\SMSGateway::sendSMS($phoneNumber, $message);
Or if you made an alias,
\SMSGateway::sendSMS($phoneNumber, $message);
Change service provider
Now if you want to change your service provider, all you need to do is, just go to the .env and change the provider to xyz and it will use the XYZSMSService class to send the SMS.
I hope this will help to understand Laravel Service Providers and Facade in a much better way.