danilovl / render-service-twig-extension-bundle
Symfony twig extension bundle provides rendering service method
Installs: 459
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: ^8.3
- symfony/console: ^7.0
- symfony/framework-bundle: ^7.0
- symfony/twig-bundle: ^7.0
- symfony/yaml: ^7.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.64
- phpstan/extension-installer: ^1.4.3
- phpstan/phpstan: ^2.0.1
- phpstan/phpstan-symfony: ^2.0.0
- phpunit/phpunit: ^10.2
README
RenderServiceTwigExtensionBundle
About
Symfony twig extension bundle provides an easy way for creating functions or filters from service methods or objects.
The main task of this extension is to replace the existing twig method render(controller())
.
The main disadvantage of the existing method is that it performs a sub-request, which increases the total query execution time.
Comparison performance metrics
In this example, the same page was used, with the only difference being the number of times the standard render(controller())
method was used compared to the new runtime twig function.
On the left side, you can see the use of the standard twig function, while on the right side, the runtime twig function is used.
Render three times.
Render ten times.
Requirements
- PHP 8.3 or higher
- Symfony 7.0 or higher
1. Installation
Install danilovl/render-service-twig-extension-bundle
package by Composer:
composer require danilovl/render-service-twig-extension-bundle
Add the RenderServiceTwigExtensionBundle to your application's bundles if does not add automatically:
<?php // config/bundles.php return [ // ... Danilovl\RenderServiceTwigExtensionBundle\RenderServiceTwigExtensionBundle::class => ['all' => true] ];
2. Configuration
You can set global parameters for all extensions.
danilovl_render_service: prefix: null to_snake_case: true filter_options: needs_environment: false needs_context: false is_variadic: false is_safe: [] is_safe_callback: [] pre_escape: null preserves_safety: [] node_class: FunctionExpression::class deprecated: false alternative: null function_options: needs_environment: false needs_context: false is_variadic: false is_safe: [] is_safe_callback: [] node_class: FunctionExpression::class deprecated: false alternative: null
3. Usage
There exist two attributes AsTwigFilter
and AsTwigFunction
, which can be used with classes or methods.
When you use attributes with a class, it means that all public class methods are automatically transformed into filters or functions.
For example, it creates two function: math_sum
, math_min
.
If a global prefix like app_
is set, then it will create: app_math_sum
,app_math_min
.
The global parameter to_snake_case
is set to true
, which means method names are converted to snake_case
. You can disable this feature.
<?php declare(strict_types=1); namespace App\Application\Controller; use Danilovl\RenderServiceTwigExtensionBundle\Attribute\AsTwigFunction; #[AsTwigFunction('math_')] class CountService { public function sum(int $one, int $two): int { return $one + $two; } public function min(int $one, int $two): int { return $one - $two; } public function multiplicationOperation(int $one, int $two): int { return $one * $two; } }
{{ app_math_sum(2,3) }} {{ app_math_min(2,3) }} {{ app_math_multiplication_operation(2,3) }}
You can use the attribute separately with a specific method.
<?php declare(strict_types=1); namespace App\Application\Controller; use Danilovl\RenderServiceTwigExtensionBundle\Attribute\{ AsTwigFilter, AsTwigFunction }; class RenderServiceController { #[AsTwigFunction('function_sum')] public function twigFunctionSum(int $one, int $two): int { return $one + $two; } #[AsTwigFilter('filter_upper')] public function twigFilterUpper(string $text): string { return strtoupper($text); } }
{{ 'text' | app_filter_upper }} {{ app_function_sum(2,3) }}
4. Command
Show a list of twig extensions created by attributes.
php bin/console danilovl:render-service:list
License
The RenderServiceTwigExtensionBundle is open-sourced software licensed under the MIT license.