разрешение неразрешимых зависимостей [Параметр #0 [ строка $itemTypeName]] в приложении классаКонсольКомандыСинхронизация

#php #laravel

Вопрос:

Чтобы обновить несколько сущностей между локальным и удаленным приложением, я создал консольный класс, который предназначен для вызова всех классов chid, которые синхронизируют сущность

итак, материнский класс-это :

 <?php

namespace AppConsoleCommands;

use AppMailSyncErrorsNotification;
use IlluminateConsoleCommand;
use AppModelsStage;
use DateTime;
use DateTimeZone;
use IlluminateHttpRequest;
use GuzzleHttpClient;
use GuzzleHttpExceptionGuzzleException;
use IlluminateSupportFacadesLog;
use Throwable;
use IlluminateSupportFacadesMail;

class SyncIntranetSite extends Command
{

    protected $httpClient;        // GuzzleHttp Client instance 

    //Stages properties
    private $stagesSite;          //list of stages on remote site
    private $stagesIntranet;      //list of stages on intranet
    private $totalUpdatedStages;  //count of updated stages
    private $totalUpToDateStages; //count of up to date stages
    private $updatedStages;       //Array of updated stages 
    private $upToDateStages;      //Array of up to date stages
    private $insertedStages;      //Array of inserted stages
    private $deletedStages;       //Array of deleted stages
    private $syncErrors;

    private $updateTargetStage;   //url of remote stages API controller

    //Sessions properties

    // keywords properties

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'sync_site:migrate';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Sync CERF internet site with intranet database ';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();

        $this->httpClient = new Client(['verify'=>false]);

        $this->stagesSite = [];
        $this->stagesIntranet = [];
        $this->totalUpdatedStages = 0;
        $this->totalUpToDateStages = 0;
        $this->updatedStages = [];
        $this->upToDateStages = [];
        $this->insertedStages = [];
        $this->deletedStages = [];
        $this->syncErrors = [];

        $this->updateTargetStage = 'https://preprodcerf2021.cerf.test/stages';
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $this->info('***** Mise à jour automatisée du site internet CERF ******');
        $this->info('retrieving informations...');
        $this->newLine(2);

        //get all stages of current year and next year from intranet
        $this->stagesIntranet = $this->getStagesToCompare();
        //dd(count($this->stagesIntranet));
        //dd($this->stagesIntranet);

        // get all stages of current year and next year from site
        $response = $this->httpClient->get($this->updateTargetStage);
        $this->stagesSite = json_decode($response->getBody()->getContents());
        
        // array of id's in order to know if it must be inserted in site
        $stagesIntranetIds = [];
        foreach ($this->stagesIntranet as $key => $stageIntranet) {
            $stagesIntranetIds[] = $stageIntranet->id_stages;
        }

        $stagesSiteIds = [];
        foreach ($this->stagesSite as $key => $stageSite) {
            $stagesSiteIds[] = $stageSite->id;
        }

        //search all ids not present in stagesSite -> must be inserted
        $arrayDiffIds = array_diff($stagesIntranetIds,$stagesSiteIds);
        $this->newLine(2);
        $this->info('stages not present in site :'.count($arrayDiffIds));
        dump($arrayDiffIds);

        // search all ids present in StageSite -> should maybe be updated after compare their timestamps
        $arrayIntersectIds = array_intersect($stagesIntranetIds,$stagesSiteIds);
        $this->newLine(2);
        $this->info('could be updated :'.count($arrayIntersectIds));
        
        // search all id's present in site not present in intranet query result 
        $arrayDiffIdsToDelete = array_diff($stagesSiteIds,$stagesIntranetIds);
        $this->newLine(2);
        $this->info('must be deleted : '.count($arrayDiffIdsToDelete));


        //Call function to sync all items
        //$this->syncStages($this->stagesIntranet,$stagesSiteIds,$arrayDiffIds,$arrayIntersectIds,$arrayDiffIdsToDelete);

        $syncStages = new SyncStages('stages','http://myendpoint');
...
 

Дочерний класс реализует интерфейс для того, чтобы иметь стандартизированные методы для всех сущностей

 class SyncStages extends SyncIntranetSite implements SincItems{

    protected $itemTypeName;
    protected $endpointurl;

    public function __construct(string $itemTypeName, string $endpointUrl ){

        ...
 

но когда я вызываю новые SyncStages («myitem», «myendpointUrl») в классе SyncIntranetSite, я получил это странное исключение :
Исключение
BindingResolutionException неразрешимое разрешение зависимостей [Параметр #0 [ строка $itemTypeName]] в приложении классаКонсольКомандыСинхронизация

Я заметил, что когда я удаляю конструктор, он работает, но я хочу построить дочерний элемент, передающий эти 2 параметра, как я могу решить эту проблему ? Спасибо.

Комментарии:

1. Можете ли вы рассказать больше о своем SyncInternetSite классе? Возможно, вы поместили это куда-то, что в конечном итоге будет решено с помощью контейнера DI

2. Вы можете видеть дублированные переменные, потому что я собираюсь переработать это не все в материнском классе, а все сущности в их классах.

3. Если я не путаю, ваша главная проблема заключается в том, что переменная конструктора $itemTypeName не получает никаких данных, поэтому она пытается разрешить ее, и поскольку она ни к чему не может быть разрешена, она выдает вам эту ошибку… Вам нужно поделиться тем, кто вызывает вашу команду, с КАКИМИ данными, я на 100% уверен, что у вас нет данных в этой переменной. И один маленький совет, если вы используете IDE, пожалуйста, упорядочивайте свои файлы в алфавитном use порядке, так как это безумие-читать, что вы «используете» в большом классе. Если вы не используете IDE, найдите плагин для своего программного обеспечения и добавьте что-нибудь, что будет следовать за PSR !