首页 > 解决方案 > 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然后解析它的元数据。但这听起来太老套了,我运气不太好。

有什么帮助吗?提前致谢。

标签: phplaravel

解决方案


我认为您正在寻找上下文绑定

该示例如下所示:

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 类的完全限定名称的字符串。这对于命名空间类特别有用。


推荐阅读