Built with ❤️ for every smart Laravel developer
composer require imanghafoori/laravel-smart-facades
use Illuminate\Support\Facades\Facade;
class MyFacade extends Facade
{
protected static function getFacadeAccessor() // <--- normal facade
{
return 'some_key';
}
}
use Imanghafoori\SmartFacades\Facade;
class MyFacade extends Facade
{
// <--- smart facade
}
Instead of binding a string to a concrete class with an IOC container, you can choose the low-level implementation class like this:
public function register() // <-- in a service provider
{
if ($someCondition) {
MyFacade::shouldProxyTo( SomeDriver::class );
} else {
MyFacade::shouldProxyTo( SomeOtherDriver::class );
}
}
You can proxy to any abstract string (or closure) bound on the IoC container.
Note: If you invoke it twice, it will override:
MyFacade::shouldProxyTo( DriverClass1::class );
MyFacade::shouldProxyTo( DriverClass2::class ); // <--- This wins!
If you want to change the driver at call site:
MyFacade::withDriver(nonDefaultDriver::class)::myMethod();
You can introduce some code "Before" and "after" a method call, remotely: (like event listeners on eloquent models)
Here we have told the system whenever the MyFacade::findUser($id)
method was called in the system, to perform a log.
For example, let's say you want your facade to use an SMS-based driver by default, but if the text is very long (more than 200 chars) it should use an email driver.
You can do it like this:
This the adds ability to enjoy automatic method injection when calling methods on POPOs (Plain Old Php Objects) WITHOUT any performance hit when you do not need it.
class Foo { ... }
class Bar
{
// This has dependencies: "Foo", "LoggerInterface"
public function m1 (Foo $foo, LoggerInterface $logger, string $msg)
{
}
}
Calling Bar
through a Facade:
Before:
MyFacade::m1(resolve(Foo::class), resolve(LoggerInterface::class), 'hey there !');
After:
// This will work and $foo, $logger would be auto-injected for us.
MyFacade::m1('hey there !'); // normal facade
// or you may want to provide some dependencies yourself:
\Facades\Bar::m1(new Foo('hey man!'), 'hey there !'); //Now only the Logger is injected
If you find an issue or have a better way to do something, feel free to open an issue or a pull request.
As always if you found this package useful and you want to encourage us to maintain and work on it. Just press the star button to declare your willingness.
💎 Automatically find bugs before they bite.
💎 A minimal yet powerful package to give a better structure and caching opportunity for your Laravel apps.
It's not I am smarter or something, I just stay with the problems longer.
"Albert Einstein"