php - Laravel 5 - 有条件地解析服务提供者
问题描述
我是 Laravel 的新手,我有一组基类的具体实现ProductChecker
,我正在寻找最“惯用”的方法来解决我的控制器类的正确实现。
我的控制器有一个方法如下:
public function check_product($subid, $prod_id){
$sub = Subcategory::where("subid","=",$subid)->first();
$checker = //// How do I resolve the correct implementation here ?
return response()->json($checker->check_product($prod_id));
}
我知道 IoC 容器,但对我来说这听起来像是很多样板文件,必须将每个类绑定到一个字符串值(使其容易出错?)并通过相同的字符串值解析(容易出错?)。
来自 .NET,我想在我的实现类上定义引用Subcategory
然后解析它的元数据。但这听起来太老套了,我运气不太好。
有什么帮助吗?提前致谢。
解决方案
我认为您正在寻找上下文绑定
该示例如下所示:
use Illuminate\Support\Facades\Storage;
use App\Http\Controllers\PhotoController;
use App\Http\Controllers\VideoController;
use Illuminate\Contracts\Filesystem\Filesystem;
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(function () {
return Storage::disk('local');
});
$this->app->when([VideoController::class, UploadController::class])
->needs(Filesystem::class)
->give(function () {
return Storage::disk('s3');
});
你应该做的是让类实现相同的Checker
接口。至于
必须将每个类绑定到一个字符串值(使其容易出错?)
您可以使用类常量(例如Filesystem::class
)不必使用字符串来引用类和命名空间。
自 PHP 5.5 起,class 关键字也用于类名解析。您可以使用 ClassName::class 获取包含 ClassName 类的完全限定名称的字符串。这对于命名空间类特别有用。
推荐阅读
- flutter - 每次创建新的待办事项时,标题和描述的值都会重复
- firebase - Firestore 规则模拟器中的 resource.data 空错误
- date - 根据日期在 Google 表格中使用条件格式更改单元格值(文本)?
- javascript - javascript将文件插入dataTransfer [电子]
- python - 运行服务器 localhost 时,Django Watchtower 连接被拒绝
- reactjs - TS 缩短代码并在 if 表达式中重复
- struct - Rust 中的闭包生命周期通过简单的模式
- python - 如何并行化不同 keras 神经网络的预测?
- jquery - 暂停和启动带有视频的幻灯片的 Bootstrap 4 轮播
- c# - SQLClient 在 Datetimes 上运行 Varchar 转换并出现错误