Надеюсь, что кто-то может мне помочь,
Я обновляюсь с версии 5.7 до 5.8, и теперь у меня возникают проблемы с нашей настройкой хранилища.
Я использую шаблон хранилища для каждого хранилища. у нас есть контракт. У меня есть поставщик услуг (это настройка, которая должна быть отложена), чтобы связать контракты с репозиториями, поэтому, когда тип намекал на интерфейсы / контракты в контроллерах, в репозиторий вводятся данные.
У нас также есть поставщик услуг (также откладывать настройку) что при разрешении хранилища он получает некоторые данные конфигурации из файла конфигурации и вызывает методы в хранилище для настройки атрибутов.
Все это прекрасно работает на 5.7, но после обновления до 5.8 это не«т. Если я переключу контроллеры на тип подсказки для репозитория вместо контракта, он работает, но, очевидно, если / когда мы изменим репозиторий, нам придется изменить все места, на которые есть ссылки, полностью против цели кодирования интерфейса и внедрения этого.
Надеюсь, я объяснил это достаточно хорошо!
Кто-нибудь сталкивался с этим или подобным? Я проверил примечания по обновлению, и 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 и, следовательно, установка свойств. Я не получаю ни ошибок, ни исключений, ничего не выйдет