Předání parametru do události jako referenci

tomees
Člen | 59
+
0
-

Ahoj, marně se snažím dostat do události pole, které bych v ní chtěl upravit, resp. ho tam dostalu, ale ne jako referenci.

/** @var callable[] */
public $onFormatData;

...

$this->onFormatData($product, $data);
$productSuggest->onFormatData[] = function ($product, array &$data) {
	try {
		$data['vat'] = $this->vatValidator->getValidValue($this->document->base->date_created, $product->vat_id);
	} catch (NotVatRateException $e) {
		$data['_error'] = $e->getMessage();
	}
};

V tuhle chvíli dostanu Parameter 2 to AMS\Modules\Accountancy\Components\ProductModalControl::AMS\Modules\Accountancy\Components\{closure}() expected to be a reference, value given
Už jsem zkusil snad všechno, ale ať dělám co dělám, nehnu s tím…

Díky za případné rady
T

Ondřej Kubíček
Člen | 486
+
+2
-

myslím, že neuděláš, leda něco takového:

= function ($product) use (&$data) {

ale to neřeší tvuj problém, proč potřebuješ referenci? modifikuješ to pole a chceš ho vrátit a pracovat s ním dál? podle mě špatný návrh

tomees
Člen | 59
+
0
-

Osobně si nemyslím že úplně špatný.. mám prostě funkci která vrací data z DB nějak zpracovaná v poli. Ale já za určitých okolností a v určitých místech chci mít možnost do toho pole ještě něco přidat dle potřeby. Čili ta událost tam vždy být nemusí. Momentálně už teď taky vidím že to neudělám, zkusím to vymyslet jinak, nechci tam dávat natvrdo vše do té funkce

tomees
Člen | 59
+
0
-

Tak práce s ArrayHash místo obyč. array to vyřešila. Jo, neříkám, že je to úplně košer, ale jedná se o jedno místo a nechci, kvůli potřebě přidat do pole jednu hodnotu specifickou pro jedno místo, řešit nějakou extra logiku. Pak to pole jde hned ajaxem ven jako JSON..

Milo
Nette Core | 1181
+
+4
-

Špatným návrhem to minimálně zavání. Občas refaktoruju legacy aplikace a data v polích, navíc referencovaných, je největší peklo na refaktoring. Je to skoro jak globální proměnné.

Udělej si na to value objekt a konstruuj ho třeba z toho pole. Dodatečné modifikace přes metody v nichž si i ohlídáš vnitřní stav objektu. Pak máš po problému.