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.
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.
- PHP 8.3 or higher
- Symfony 7.0 or higher
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]
];
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
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) }}
Show a list of twig extensions created by attributes.
php bin/console danilovl:render-service:list
The RenderServiceTwigExtensionBundle is open-sourced software licensed under the MIT license.