Je toto efektivní cesta registrace filtrů?
- Polki
- Člen | 553
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'])
JsonFilters.php
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)
- dakur
- Člen | 493
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ší:
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)
- Pepino
- Člen | 256
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);
}
}
- Kcko
- Člen | 468
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)