希望有人可以帮助我
我从5.7版更新到5.8版,现在我的存储库设置出现了问题。
我正在使用存储库模式,对于每个存储库,我们都有一个合同。我有一个服务提供商(将其设置为延迟设置)以将合同绑定到存储库,因此当类型提示存储库注入到的控制器中的接口/合同时。
我们还有一个服务提供商(也将推迟设置),该服务提供商在解析存储库时会从配置文件中获取一些配置数据,并调用存储库中的方法来设置属性。
这一切在5.7上都很好用,但升级到5.8后却没有。如果我切换控制器的类型来提示存储库而不是合同,那么它很有效,但是很显然,如果/当我们更改存储库时,我们必须修改所有引用的地方,完全违背了对接口进行编码和注入的目的。 / p>
希望我已经解释得足够好了!
有人反对或类似吗?我已经检查了升级说明,并且5.8不再使用defer属性,因为它实现了我正在做的接口,但是我看不到其他任何东西,并且我正在努力对其进行进一步的调试。
https://laravel.com/docs/5.8/upgrade#deferred-service-providers
任何人都可以提供的帮助会很棒。
如果我切换回5.7,则没有问题,或者如果使用实际的存储库并在控制器中键入提示,则没有问题,仅在使用协定/接口时发生
这是存储库的服务提供商,用于设置存储库的属性
<?php
namespace App\Providers\Repositories\Erp;
use App\Models\ERP_OLTP\WorkOrderStatus as WorkOrderStatusModel;
use App\Repositories\Erp\EloquentMaterialRequirements;
use Illuminate\Contracts\Config\Repository as ConfigRepositoryInterface;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\ServiceProvider;
class MaterialRequirementsServiceProvider extends ServiceProvider implements DeferrableProvider
{
public function register()
{
$this->app->resolving(
EloquentMaterialRequirements::class,
function (EloquentMaterialRequirements $repo, $app) {
$config = $app[ConfigRepositoryInterface::class]->get('materialRequirements');
$statusIds = array_reduce(
$config['workOrderStatuses'],
function ($acc, $statusCode) {
$acc[] = WorkOrderStatusModel::STATUS[$statusCode];
return $acc;
},
[]
);
$repo->setDemandStatusIds($statusIds);
$repo->setDemandWeekCount($config['weekCount']);
$repo->setAverageUsageWeekCount($config['averageWeeklyUsageMaxAgeWeeks']);
}
);
}
public function provides()
{
return [
EloquentMaterialRequirements::class,
];
}
}
这里是将仓库绑定到合同的服务提供商
<?php
namespace App\Providers;
use Illuminate\Contracts\Config\Repository as ConfigRepositoryInterface;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Foundation\Application;
use Illuminate\Support\ServiceProvider;
class ErpRepositoriesServiceProvider extends ServiceProvider implements DeferrableProvider
{
public function register()
{
foreach ($this->getBindings() as $contract => $implementation) {
$this->app->bind($contract, $implementation);
}
}
public function provides()
{
$services = [];
foreach (array_keys($this->getBindings()) as $contract) {
$services[] = $contract;
}
return $services;
}
private function getBindings(): array
{
return $this->app[ConfigRepositoryInterface::class]->get('repositories.bindings');
}
}
这是config.repositories,我删除了其他存储库以使其缩小
<?php
use App\Contracts\Erp\Repositories as Contracts;
use App\Managers\Erp\Repositories as Managers;
use App\Repositories\Erp as Repositories;
return [
'bindings' => [
Contracts\MaterialRequirements::class => Repositories\EloquentMaterialRequirements::class,
],
];
它根本不会调用MaterialRequirementsServiceProvider,或者如果它没有解决EloquentMaterialRequirements :: class并因此无法设置属性。我没有错误,没有异常,没事