升级到5.8后的IoC解决问题

时间:2019-11-06 09:53:21

标签: laravel ioc-container laravel-5.8

希望有人可以帮助我

我从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并因此无法设置属性。我没有错误,没有异常,没事

0 个答案:

没有答案