How to Create Laravel Facade and Simplify Code
LaravelLast month, I started training in one company where I am giving Laravel Training to around 15-20 PHP Developers, where we discussed the core Laravel concepts to them including Service Providers, Facades, Eloquent, and many more.
There I explained to them the use and beauty of Laravel Facades and how the use of Facade can simplify code. We took a real practical example and use case they have, which I'm outlining here.
Use Case
They are building a CRM application and using some third party API to send an SMS. Though Laravel Notification Channels are the best way to send the SMS but here that's not the goal of this post, so we will try to stick to the Facade development to send the SMS.
Here is how we were sending SMS so far.
Traditional way
Have one common Class/Repository/Manager called SMSManager
.
<?php
namespace App\Managers;
class SMSManager
{
public function sendSMS($recipient, $message)
{
// code to send sms
}
}
This code and pattern look completely fine. But the problem was every time when we needed to send an SMS they needed to either Create/Inject SMSManager
class and call sendSMS
method of it.
Parsedown | the parser that we created ... $smsManager = new SMSManager(); $smsManager->sendSMS($phoneNumber, $message); ... Parsed in 0.13 ms or 1 times faster
...
$smsManager = new SMSManager();
$smsManager->sendSMS($phoneNumber, $message);
...
Also, this code is not scalable. If you want to change your SMS Provider then you need to replace the function or create a new function. Or you want to use multiple SMS Providers for different users based on their subscription then this way doesn't work.
Laravel Facade Way
Laravel Facades is a great way to call static interfaces of the classes. So you don't need to make/inject SMSManager
class instance and you can directly call sendSMS
function.
To do that, we need to create Facade class and bind its accessor in Service Provider. We can create our own service provider or even can do it in AppServiceProvider
as well. To keep it simple, let's use AppServiceProvider
as of now.
Create a Facade Class
Create a new class called SMSGateway
into app\Facades
directory with the following code,
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class SMSGateway extends Facade
{
/**
Get the registered name of the component.
@return string
/
protected static function getFacadeAccessor()
{
return 'sms_gateway';
}
}
Bind Facade with SMSManager Implementation
The next step is to bind our facade class with our real SMSManager
implementation. To do that, open AppServiceProvider
and add the following line to the register
method,
$this->app->bind('sms_gateway', function ($app) {
return new SMSManager();
});
Now, we are all set to use our Facade in our code.
Usage of Facade in code
To send an SMS, we now no longer need to create instance of SMSManager
, we can directly use,
\App\Facades\SMSGateway::sendSMS($phoneNumber, $message);
Make Alias (Optional)
Or, you can add this facade to config/app.php
into aliases
section,
'SMSGateway' => App\Facades\SMSGateway::class,
And you can directly call,
\SMSGateway::sendSMS($phoneNumber, $message);
So this way, we can clean out our code and utilize the Laravel Facade to make our code more beautiful.
Hope this helps.