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