‚Serialization of 'Closure‘ is not allowed'

před rokem

adioverride
Člen | 20
+
0
-

Ahoj,
prosím vás dostávám chybu: „Fatal error: Uncaught exception ‚Exception‘ with message ‚Serialization of 'Closure‘ is not allowed' in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0“, která se nevypíše v Tracy, ale jako plain text pod webem (funkčnost je jinak OK).

Vytvořil jsem si třídu, ve které vracím cenu s DPH na základě zvolené měny, (kód jsem osekal kvůli přehlednosti). Myslím si, že chybu způsobí inject \Nette\Http\Request, pokud jej smažu (a logicky upravím kód, tak aby nevolal neexistující proměnnou), tak žádnou chybu nedostanu. Nicméně k httpRequest bych se rád dostal.

class CartItem extends Entity
{
	/** @inject @var \Nette\Http\Request */
	public $httpRequest;

	/**
	 * @return array
	 */
	public function getPriceVat()
	{
		if ($code = $this->httpRequest->getQuery('currency')) {
			....
		} else {
			...
		}
	}
}

Prosím nevíte co dělám špatně? Nebo bude chyba spíše jinde?

Díky,
A.

před rokem

David Matějka
Moderator | 6202
+
+1
-

mít v entitě závislosti je anti pattern. předávej si currency jako parametr getPriceVat metody

před rokem

kocourPB
Člen | 47
+
+1
-

Ahoj,

vidim, ze CartItem je podedene od nejakej Entity. Ak je CartItem naozaj entitou (tzn. predstavuje nejaky jeden zaznam z DB) injectovat do nej nieco je nespravne (bad practice). Skor by si si mal tu $currency predat do getPriceVat($currency) ako parameter tam odkial ju volas napr.:

class CartItem extends Entity
{

    /**
     * @return array
     */
    public function getPriceVat($currency)
    {
        if ($code = $currency) {
            ....
        } else {
            ...
        }
    }
}

před rokem

adioverride
Člen | 20
+
0
-

Díky, přepsal jsem to jako parametr, zní to logičteji no :)