Služba ako filter nefunguje správne

před rokem

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.

před rokem

Jan Endel
Člen | 1024
+
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

před rokem

CZechBoY
Člen | 3386
+
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)

před rokem

Kcko
Člen | 302
+
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 …)

před rokem

Jan Endel
Člen | 1024
+
+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)