Služba ako filter nefunguje správne
- Danndy
- Člen | 35
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
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
- Kcko
- Člen | 468
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
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)