twig/extra-bundle
Symfony bundle that auto-enables all Twig “extra” extensions with zero configuration. Install via Composer and instantly access additional Twig features in your Symfony app without manually registering each extension.
Installation:
composer require twig/extra-bundle
(Note: In Laravel, this requires twig-laravel/twig as a bridge.)
Basic Usage:
twig-laravel/twig is installed and configured in config/app.php:
'providers' => [
Twig\Laravel\TwigServiceProvider::class,
],
config/twig.php (if using twig-laravel/twig):
'extensions' => [
Twig\Extra\String\StringExtension::class,
Twig\Extra\Text\TextExtension::class,
],
First Use Case: Use Twig’s extended filters/functions in a template:
{# StringExtension #}
{{ 'hello world'|upper }}
{# TextExtension #}
{{ 'lorem ipsum'|truncate(20, '...') }}
{# ArrayExtension #}
{% for key, value in {'a': 1, 'b': 2} %}
{{ key }}: {{ value }}
{% endfor %}
Selective Extension Activation:
StringExtension for text manipulation).'extensions' => [
Twig\Extra\String\StringExtension::class,
Twig\Extra\Text\TextExtension::class,
],
Form Handling (Symfony-Laravel Hybrid):
Form component in Laravel, leverage FormExtension:
{{ form_start(form) }}
{{ form_widget(form.name) }}
{{ form_errors(form) }}
{{ form_end(form) }}
Form component installed (composer require symfony/form).URL Generation:
UrlExtension for Symfony-style routing (if symfony/routing is available):
{{ path('home') }}
{{ url('https://example.com') }}
@route or route() helper instead.Text Processing:
IntlExtension (if symfony/intl is installed):
{{ 'hello'|trans({'%name%': 'John'}) }}
{{ 1000|filesize }}
Custom NodeVisitors:
use Twig\TwigFunction;
$twig->addFunction(new TwigFunction('custom_function', function() {
return 'custom logic';
}));
Laravel-Twig Hybrid Workflow:
{# app/Resources/views/admin/dashboard.html.twig #}
{{ form_widget(form.user) }}
Dynamic Template Logic:
ArrayExtension for complex data structures:
{% for item in items if item.active %}
{{ item.name|upper }}
{% endfor %}
Asset Management:
AssetExtension for Symfony’s AssetMapper (if integrated):
{{ asset('css/style.css') }}
mix('css/style.css') or asset('css/style.css').Avoid Symfony Dependencies:
CsrfExtension or WebProfilerExtension in Laravel unless Symfony components are explicitly used.Laravel-Specific Shims:
Router) with Laravel equivalents:
$twig->addExtension(new \Twig\Extra\UrlExtension(
new \Illuminate\Routing\Router(), // Laravel's Router
new \Illuminate\Http\Request()
));
Testing:
TwigView:
use Twig\Laravel\View\TwigView;
$view = new TwigView($twig, 'template.html.twig', ['data' => $data]);
$content = $view->render();
Performance:
'cache' => true,
'auto_reload' => env('APP_DEBUG'),
Symfony-Specific Extensions:
CsrfExtension or FormExtension fail silently in Laravel without Symfony’s RequestStack or Form component.Routing Conflicts:
UrlExtension expects Symfony’s Router; Laravel’s Router has a different interface.route() helper or create a custom Twig extension.CSRF Token Mismatch:
csrf_token filter assumes Symfony’s CsrfTokenManager; Laravel uses csrf_token() helper.@csrf or a custom Twig filter:
$twig->addFunction(new \Twig\TwigFunction('csrf_token', function() {
return csrf_token();
}));
Asset Pipeline Conflicts:
AssetExtension expects Symfony’s AssetMapper; Laravel uses mix-manifest.json.mix() or asset() helpers directly in Twig.IntlExtension Dependencies:
symfony/intl for localization features (e.g., |trans).trans() helper or install the dependency.Extension Not Loading:
config/twig.php or via service provider.composer dump-autoload
Undefined Filters/Functions:
\Twig\Extra\String\StringExtension).dd($twig->getExtensions()); // List loaded extensions
Symfony Service Missing:
app() to bind missing Symfony services:
$twig->addExtension(new \Twig\Extra\UrlExtension(
app(\Illuminate\Routing\Router::class),
app(\Illuminate\Http\Request::class)
));
Laravel-Friendly Extensions:
StringExtension, TextExtension, and ArrayExtension for Laravel use cases.Custom Extensions:
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class LaravelTwigExtension extends AbstractExtension {
public function getFunctions() {
return [
new TwigFunction('laravel_helper', function() {
return 'Laravel-specific logic';
}),
];
}
}
Configuration Overrides:
config/twig.php:
'extensions' => [
// Only enable what you need
\Twig\Extra\String\StringExtension::class,
],
Blade-Twig Interop:
{# Twig template #}
{% if user.is_admin %}
{{ 'Admin Panel'|upper }}
{% endif %}
@if(auth()->user()->is_admin)
{{ Str::upper('Admin Panel') }}
@endif
Performance Tuning:
'auto_reload' => false,
'cache' => storage_path('framework/views'),
How can I help you explore Laravel packages today?