hyder / facade-pattern
在此模式中,您将创建提供对底层服务实现简化、静态接口的Facade类。服务类将执行实际的业务逻辑并与数据库或其他外部系统通信。
Requires
- php: ^7.3|^8.0
README
此包为Laravel中的Facade模式提供脚手架。Facade模式是一种设计模式,有助于将业务逻辑从控制器或其他客户端代码中分离出来,使其更容易维护和测试。
为什么选择Facade模式而不是Repository模式?
在Repository模式中,数据访问层的实现被抽象在接口之后。该接口定义了仓库必须实现的方法,但未提供任何访问底层实现细节的方法。
这种缺乏灵活性可能在需要从代码的其他部分访问仓库实现细节的情况下造成问题。例如,如果您需要在队列作业或另一个简单类中访问仓库,您不能简单地创建一个新的仓库实例,因为它被接口抽象了。
解决此问题的方法之一是将仓库实例作为参数传递给队列作业或简单类,但这可能导致紧密耦合并使代码更难维护。
另一种解决方法是使用依赖注入容器向队列作业或简单类提供仓库实例。然而,这会增加额外的复杂性和配置需求。
总的来说,Repository模式的缺乏灵活性在某些情况下可能是一个缺点,尤其是在需要从代码的其他部分访问仓库实现细节时。
这就是Facade模式提供的解决方案。您可以在队列作业或另一个简单类中轻松访问Facade。
安装
您可以通过composer安装此包
composer require hyder/facade-pattern --dev
发布提供者
安装后,您需要运行vendor:publish命令以发布提供者文件。您可以通过运行以下命令来完成此操作
php artisan vendor:publish --provider=Hyder\FacadePattern\FacadePatternServiceProvider --tag=provider
这将发布包的FacadeServiceProvider到app/Providers目录,然后您可以根据需要进行修改。
FacadeServiceProvider类负责将Facade的服务类注册到Laravel容器中。这允许您在需要时轻松交换服务类的实现。
配置
您必须手动在config/app.php文件中添加服务提供者
'providers' => [ // ... App\Providers\FacadeServiceProvider::class, ];
创建脚手架
现在您可以通过运行facade-pattern:scaffold命令来生成必要的脚手架文件。您可以通过运行以下命令来完成此操作
php artisan facade-pattern:scaffold Example
这将创建以下文件在您的app目录中
app/
└── Patterns/
├── Facades/
│ ├── <name>Facade.php
│ └── ... other facades
├── Interfaces/
│ ├── <name>Interface.php
│ └── ... other interfaces
└── Services/
├── <name>FacadeService.php
└── ... other services
-
Patterns/Facades目录包含Facade类,它们为底层服务类提供简单、一致的接口。您可以根据需要创建额外的Facade类。 -
Patterns/Interfaces目录包含仓库接口,定义了服务类必须实现的方法。您可以根据需要创建额外的接口文件。 -
《Patterns/Services》目录包含服务类,这些类执行实际的业务逻辑并与数据库或其他外部系统进行通信。您可以根据需要创建额外的服务类。
创建外观、接口和服务
通过运行facade-pattern:facade、facade-pattern:interface和facade-pattern:service命令,您可以生成必要的文件。您可以运行以下命令来完成此操作
外观
php artisan facade-pattern:facade ExampleFacade
接口
php artisan facade-pattern:interface ExampleInterface
服务
php artisan facade-pattern:service ExampleFacadeService
别忘了在FacadeServiceProvider提供者的register()方法中注册您的外观服务类。
这就完成了!现在您可以在您的Laravel应用程序中使用外观模式了。
贡献
如果您想为此包做出贡献,请创建一个pull request或打开一个问题。
许可
此包是开源软件,在MIT许可下发布。您可以在自己的项目中自由修改和使用此包。