danilovl/render-service-twig-extension-bundle

Symfony twig extension bundle provides rendering service method

v4.0.2 2024-04-06 12:30 UTC

README

phpunit downloads latest Stable Version license

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.

Alt text

Render ten times.

Alt text

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.