imanghafoori/laravel-smart-facades

在 Laravel Facades 上添加一些功能

v1.0.10 2023-02-15 15:00 UTC

This package is auto-updated.

Last update: 2024-09-03 03:07:57 UTC


README

🍄 Laravel Smart Facades 🍄

Laravel 中的“策略模式”,通过添加一些功能变得简单。

在 Laravel Facades 之上。

专为每个聪明的 Laravel 开发者打造 ❤️

                                           Quality Score Code Quality Software License Check Imports StyleCI

🔦 安装

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 模型的事件监听器)

image

这里我们告诉系统,每当在系统中调用 MyFacade::findUser($id) 方法时,都要执行日志记录。

⚡️ 根据参数值选择驱动

例如,假设您想要您的门面默认使用基于短信的驱动程序,但如果文本非常长(超过 200 个字符),则应使用电子邮件驱动程序。

您可以这样做

image

🔧 在通过门面调用方法时自动方法注入。

这增加了在调用 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"