79 lines
2.0 KiB
PHP
79 lines
2.0 KiB
PHP
|
<?php
|
||
|
namespace nur\mapper\base;
|
||
|
|
||
|
use ArrayAccess;
|
||
|
use nur\b\coll\TBaseArray;
|
||
|
use nur\b\coll\TGenericArray;
|
||
|
use nur\mapper\base\oobd\IOobdManager;
|
||
|
|
||
|
/**
|
||
|
* Class ProducerAggregate: un aggrégateur de producer, qui fournit les données
|
||
|
* des producers qu'il aggrège
|
||
|
*/
|
||
|
class ProducerAggregate extends Producer implements ArrayAccess {
|
||
|
use TBaseArray, TGenericArray;
|
||
|
|
||
|
function setup(): void {
|
||
|
parent::setup();
|
||
|
foreach ($this->data as &$producer) {
|
||
|
$producer = producer_utils::ensure_producer($producer);
|
||
|
}; unset($producer);
|
||
|
}
|
||
|
|
||
|
function hasOvalue(string $name): bool {
|
||
|
if ($this->_hasOobdValue($name)) {
|
||
|
return true;
|
||
|
} elseif ($this->sharedOobdManager !== null
|
||
|
&& $this->sharedOobdManager->hasOvalue($name)) {
|
||
|
return true;
|
||
|
}
|
||
|
foreach ($this->data as $producer) {
|
||
|
if ($producer instanceof IOobdManager && $producer->hasOvalue($name)) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* l'accès aux données OOB de la chaine de producer n'est possible qu'après
|
||
|
* l'appel de la méthode {@link setup()}
|
||
|
*/
|
||
|
function getOvalue(string $name, $default=null) {
|
||
|
if ($this->_hasOobdValue($name)) {
|
||
|
return $this->_getOobdValue($name, $default);
|
||
|
} elseif ($this->sharedOobdManager !== null
|
||
|
&& $this->sharedOobdManager->hasOvalue($name)) {
|
||
|
return $this->sharedOobdManager->getOvalue($name, $default);
|
||
|
}
|
||
|
foreach ($this->data as $producer) {
|
||
|
if ($producer instanceof IOobdManager && $producer->hasOvalue($name)) {
|
||
|
return $producer->getOvalue($name, $default);
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
function producer() {
|
||
|
foreach ($this->data as $producer) {
|
||
|
if ($producer instanceof Producer) {
|
||
|
try {
|
||
|
yield from $producer;
|
||
|
} finally {
|
||
|
$producer->close();
|
||
|
}
|
||
|
$this->return = $producer->getReturn();
|
||
|
} else {
|
||
|
yield from $producer;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected function teardown(): void {
|
||
|
parent::teardown();
|
||
|
foreach ($this->data as $producer) {
|
||
|
$producer->close();
|
||
|
}
|
||
|
}
|
||
|
}
|