Služba ako filter nefunguje správne

Danndy
Člen | 35
+
0
-

Zdravím. Mám problém s vytvorením filtru, ktorý by mal využívať funkčnosť jednej z mojích služieb (resp. služba bude filter).

Mám nasledovnú službu:

<?php

namespace App\Model;


class ImageResizer extends \Nette\Object
{
	/** @var \App\Model\Configurator */
	private $configurator;

	private $imagesDir;
	private $imagesCacheDir;

	public function __construct(\App\Model\Configurator $configurator, $imagesDir) {
		$this->configurator = $configurator;
		$this->imagesDir = $imagesDir;
		$this->imagesCacheDir = $imagesDir. '/cache';
	}

	public function resize($image, $width, $height, $mode = self::EXACT) {
		// logika zmenšenia obrázku
	}

	public function __invoke($image, $width, $height, $mode = self::EXACT) {
        return $this->resize($image, $width, $height, $mode);
    }
}

Túto službu som registroval cez config nasledovne:

services:
	.
	.
	.
	imageResizer: App\Model\ImageResizer(@configurator, %imagesDir%)

	nette.latteFactory:
		setup:
			- addFilter('resize', @imageResizer)

Následne keď volám tento filter v latte:

<img src="{$searchUser['profilePicture']|resize:50:50}"/>

Tak filter sa zavolá v poriadku, ale nefunguje ako by mal, pretože v public funkcii public function resize($image, $width, $height, $mode = self::EXACT){} nie sú nastavené privátne atribúty tejto sluzby, ktoré sa inicializujú v jej konštruktore.

Vedel by mi niekto poradiť kde robím chybu, a ako mám postupovať?

Za rady vopred ďakujem.

Jan Endel
Člen | 1016
+
0
-

Napadá mě vyhnout se použití metody __invoke, protože pak se ti nezavolá konstruktor, spíš bych ten filter přidal jako callback. Mělo by fungovat něco jako:

services:
    .
    .
    .
    imageResizer: App\Model\ImageResizer(@configurator, %imagesDir%)

    nette.latteFactory:
        setup:
            - addFilter('resize', [@imageResizer, 'resize']) # možná i @imageResizer::resize, ale tím už si nejsem tak jist
CZechBoY
Člen | 3608
+
0
-

@JanEndel @imageResizer::resize by mělo fungovat, minimálně já to tak s Nette 2.3 používám

Editoval CZechBoY (3. 4. 2018 13:58)

Kcko
Člen | 468
+
0
-

Jan Endel napsal(a):

Napadá mě vyhnout se použití metody __invoke, protože pak se ti nezavolá konstruktor, spíš bych ten filter přidal jako callback.

To je nějaká blbost ne? Já mám filter jako třídu, kterou si zaregistruji v neonu a poté ji používám jako funkci (takže výstupem je __invoke a konstruktor se mi normálně volá, jak autowiring tak další věci v konstruktoru …)

Jan Endel
Člen | 1016
+
+1
-

Kcko napsal(a):

Jan Endel napsal(a):

Napadá mě vyhnout se použití metody __invoke, protože pak se ti nezavolá konstruktor, spíš bych ten filter přidal jako callback.

To je nějaká blbost ne? Já mám filter jako třídu, kterou si zaregistruji v neonu a poté ji používám jako funkci (takže výstupem je __invoke a konstruktor se mi normálně volá, jak autowiring tak další věci v konstruktoru …)

Máš pravdu, zavolá se, https://3v4l.org/IO1JO, člověk se pořád učí něco nového :-).

Každopádně, protože mu invoke jenom provolává jinou metodu, je zbytečné ji psát.

Editoval Jan Endel (3. 4. 2018 14:14)