mám otázku ohledně správné registrace filtrů. Prosím o výhody a nevýhody těchto 2 řešení:
config.neon:
services: latte.filters.json: App\Filters\Latte\JsonFilters latte.latteFactory: setup: - @latte.filters.json::install(@self)
JsonFilters.php
final class JsonFilters { public function install(Latte\Engine $engine): void { $engine->addFilter('json', [$this, 'json']); } /** * @param array $value * @return string */ public function json(array $value): string { try { return Json::encode($value); } catch (JsonException $e) { return ''; } } }
Nebo je lepší dělat to nějak takto: config.neon
services: LatteJsonFilter: App\Filters\Latte\JsonFilters nette.latteFactory: setup: - addfilter('json', [@LatteJsonFilter, 'json'])
final class JsonFilters { /** * @param array $value * @return string */ public function json(array $value): string { try { return Json::encode($value); } catch (JsonException $e) { return ''; } } }
Bráno v Nette sandboxu.
Editoval Polki (8. 10. 2021 22:11)
Přijde mi to už jako hodně mikro-optimalizace. Prostě jak je ti to pohodlné, tak to používej. :-)
My třeba využíváme __invoke(), je to o chlup kratší:
__invoke()
services: filter.json: App\Infrastructure\Latte\Filter\Json latte.latteFactory: setup: - addFilter(json, @filter.json)
final class Json { public function __invoke(\JsonSerializable $serializable): string { return \Nette\Utils\Json::encode($serializable->jsonSerialize()); } }
Editoval dakur (9. 10. 2021 11:18)
Jen poznámka: json encode dělá |escapeJs.
|escapeJs
dakur napsal(a): services: filter.json: App\Infrastructure\Latte\Filter\Json latte.latteFactory: setup: - addFilter(json, @filter.json) Copy
dakur napsal(a):
Tez mam rad toto.
Jen dotaz. Je vhodná registrace filtrů následovně?
latte.latteFactory: setup: - addFilter(null, [App\Model\Latte\Filters, loader])
public static function loader($filter, $value) { if (method_exists(__CLASS__, $filter)) { $args = func_get_args(); array_shift($args); return call_user_func_array([__CLASS__, $filter], $args); } }
Ano.
Já to tedy dělám ještě jinak, ani jsem to v dokumentaci nenašel (našel jsem to někde ve starším projektu u kolegy).
popovickyLatteFilters: class: Andweb\Latte\PopovickyFilters tags: - run latte.templateFactory: setup: - "$onCreate[]" = [@popovickyLatteFilters, 'register']
A filtry mají krom konkrétních metod tento začátek
public function register($template) { $template->addFilter(null, [self::class, 'common']); } public static function common($filter, $value) { if (method_exists(__CLASS__, $filter)) { $args = func_get_args(); array_shift($args); return call_user_func_array([__CLASS__, $filter], $args); } } }
Editoval Kcko (16. 2. 2022 10:28)