imanghafoori / laravel-smart-facades
在 Laravel Facades 上添加一些功能
v1.0.10
2023-02-15 15:00 UTC
Requires
- php: >=7.1.3
- illuminate/events: ~5.1|^6.0|^7.0|^8.0|^9.0|10.*
- illuminate/support: ~5.1|^6.0|^7.0|^8.0|^9.0|10.*
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ~7.0|~8.0
- phpunit/phpunit: ~9.0
Suggests
- imanghafoori/laravel-anypass: Allows you login with any password in local environment.
- imanghafoori/laravel-masterpass: You can easily set a master password without code change.
- imanghafoori/laravel-terminator: Gives you opportunity to refactor your controllers.
- imanghafoori/laravel-widgetize: Gives you a better structure and caching opportunity for your web pages.
README
🍄 Laravel Smart Facades 🍄
Laravel 中的“策略模式”,通过添加一些功能变得简单。
在 Laravel Facades 之上。
专为每个聪明的 Laravel 开发者打造 ❤️
🔦 安装
composer require imanghafoori/laravel-smart-facades
⚡️ 无需使用 getFacadeAccessor()
之前
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 }
⚡️ 通过 shouldProxyTo($class)
设置默认驱动
而不是使用 IoC 容器将字符串绑定到具体类,您可以选择类似这样的低级实现类
public function register() // <-- in a service provider { if ($someCondition) { MyFacade::shouldProxyTo( SomeDriver::class ); } else { MyFacade::shouldProxyTo( SomeOtherDriver::class ); } }
您可以将代理到任何在 IoC 容器上绑定的抽象字符串(或闭包)。
注意:如果您调用两次,它将覆盖
MyFacade::shouldProxyTo( DriverClass1::class ); MyFacade::shouldProxyTo( DriverClass2::class ); // <--- This wins!
⚡️ 使用非默认驱动
如果您想在调用位置更改驱动
MyFacade::withDriver(nonDefaultDriver::class)::myMethod();
⚡️ 方法钩子
您可以在方法调用之前和之后远程引入一些代码:(类似于 eloquent 模型的事件监听器)
这里我们告诉系统,每当在系统中调用 MyFacade::findUser($id)
方法时,都要执行日志记录。
⚡️ 根据参数值选择驱动
例如,假设您想要您的门面默认使用基于短信的驱动程序,但如果文本非常长(超过 200 个字符),则应使用电子邮件驱动程序。
您可以这样做
🔧 在通过门面调用方法时自动方法注入。
这增加了在调用 POPO(Plain Old Php Objects)上的方法时享受自动方法注入的能力,而不会影响性能。
🐙 示例
class Foo { ... } class Bar { // This has dependencies: "Foo", "LoggerInterface" public function m1 (Foo $foo, LoggerInterface $logger, string $msg) { } }
通过门面调用 Bar
之前
MyFacade::m1(resolve(Foo::class), resolve(LoggerInterface::class), 'hey there !');
之后
// 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
🙋 贡献
如果您发现了一个问题或有一个更好的方法来做某事,请随时打开一个问题或拉取请求。
⭐ 您的星标让我们做得更多 ⭐
始终如此,如果您发现此包有用,并且希望鼓励我们维护和改进它,只需按星标按钮即可声明您的意愿。
作者的其他作品
Laravel Microscope
💎 在它们咬人之前自动找到错误。
Laravel Widgetize
💎 一个简单但强大的包,为您提供更好的 Laravel 应用程序结构和缓存机会。
It's not I am smarter or something, I just stay with the problems longer.
"Albert Einstein"