Je toto efektivní cesta registrace filtrů?

uživatel-p
Člen | 553
+
0
-

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 | 356
+
+2
-

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)

David Grudl
Nette Core | 7777
+
+3
-

Jen poznámka: json encode dělá |escapeJs.

Felix
Nette Core | 1163
+
0
-

dakur napsal(a):

services:
    filter.json: App\Infrastructure\Latte\Filter\Json
    latte.latteFactory:
		setup:
			- addFilter(json, @filter.json)

Tez mam rad toto.

Pepino
Člen | 135
+
0
-

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 | 383
+
0
-

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. 10:28)