IoC решает проблему после обновления до 5.8 - PullRequest
0 голосов
/ 06 ноября 2019

Надеюсь, что кто-то может мне помочь,

Я обновляюсь с версии 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 и, следовательно, установка свойств. Я не получаю ни ошибок, ни исключений, ничего не выйдет

...