我是Laravel的新手,我为基类if
提供了一组具体的实现,我正在寻找最“惯用”的方法来从控制器类中解析正确的实现。
我的控制器的方法如下:
Excel::load($request->file('file')->getRealPath(), function ($reader) use ($group) {
foreach ($reader->toArray() as $key => $row) {
$contact = new Contact();
$contact->group_id = $group->id;
$contact->company_id = Auth::user()->company_id;
$contact->contact_name = $row['contact_name'];
$contact->contact_number = $row['contact_number'];
$contact->save();
}
});
我了解IoC容器,但对我来说听起来很简单,必须将每个类绑定到一个字符串值(使其易于出错?)并使用相同的字符串值(易于出错?)进行解析。
.NET即将来临,我想到了在实现类中定义引用ProductChecker
的元数据,然后对其进行解析。但这听起来太骇人听闻了,我对此没有多大运气。
有什么帮助吗?预先感谢。
答案 0 :(得分:1)
我认为您正在寻找contextual binding
示例如下:
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类。特别是 对于命名空间类有用。