Installation:
composer require craue/twigextensions-bundle
Ensure the bundle is enabled in config/bundles.php:
return [
// ...
Craue\TwigExtensionsBundle\CraueTwigExtensionsBundle::class => ['all' => true],
];
First Use Case:
Use the craue_default filter in a Twig template to replace empty values with HTML-safe placeholders:
{{ user.name | craue_default('<em>No name provided</em>') }}
No need for | e or | raw—the extension handles HTML escaping automatically.
Decorating Empty Values:
Replace Symfony’s default default filter with craue_default for cleaner HTML placeholders:
{% set price = product.price | craue_default('<span class="placeholder">N/A</span>') %}
Array Manipulation:
Use craue_without to filter arrays dynamically:
{{ user.roles | craue_without(['ROLE_GUEST']) | join(', ') }}
Or modify arrays with craue_replaceKey:
{{ config | craue_replaceKey('theme', 'dark') }}
Form Cloning: Clone forms for multi-step wizards or dynamic sections:
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
<hr>
{{ form | craue_cloneForm | form_start }}
{{ form_widget(form) }}
{{ form_end(form) }}
String Formatting:
Ensure consistent punctuation with craue_trailingDot:
{{ article.title | craue_trailingDot }} — {{ article.date }}
Custom Filters: Extend the bundle by creating your own Twig extensions and merging them with the bundle’s compiler pass:
// src/Twig/AppExtension.php
class AppExtension extends \Twig\Extension\AbstractExtension
{
public function getFilters()
{
return [
new \Twig\TwigFilter('app_custom_filter', [$this, 'customFilter']),
];
}
}
Register the extension in config/packages/twig.yaml:
twig:
extensions:
- App\Twig\AppExtension
Symfony Forms: Combine with Symfony’s form theme system for reusable components:
{% block form_row %}
{{ form_label(form) }}
{{ form_widget(form) | craue_default('<small>Optional</small>') }}
{% endblock %}
HTML Escaping:
craue_default auto-escapes HTML, but nested filters (e.g., | upper) may break escaping. Use | raw cautiously:
{{ unsafeHtml | craue_default('<p>Fallback</p>') | raw }}
Form Cloning Quirks:
{{ form_rest(form | craue_cloneForm) }}
Callback validators) that rely on object state.Array Key Handling:
craue_replaceKey and craue_removeKey treat keys as strings. For numeric keys, ensure type consistency:
{{ array | craue_replaceKey(0, 'new_value') }} {# Works #}
{{ array | craue_replaceKey(1, 'new_value') }} {# May fail if key is string '1' #}
{{ dump() }} to inspect values before/after filters:
{{ someValue | dump }} {{ someValue | craue_default('fallback') | dump }}
getName() differs from the original (Symfony may append _clone).Custom Placeholders:
Override the default placeholder logic by extending the DecorateEmptyValueExtension:
// src/Twig/CustomDefaultExtension.php
class CustomDefaultExtension extends \Craue\TwigExtensionsBundle\Twig\Extension\DecorateEmptyValueExtension
{
protected function getDefaultPlaceholder(): string
{
return '<i class="fa fa-exclamation"></i>'; // Custom icon
}
}
Register it as a decorator in config/services.yaml:
services:
App\Twig\CustomDefaultExtension:
decorates: 'craue.twig_extension.decorate_empty_value'
arguments: ['@.inner']
Array Translation:
Extend craue_translateArray to support custom translation domains:
{{ menu.items | craue_translateArray('admin') }}
Modify the extension to accept a domain parameter.
Performance:
For large arrays, craue_without or craue_replaceKey may trigger performance overhead. Cache results if used repeatedly:
{% set filteredArray = cache(app.container.get('doctrine').getManager().getConnection().getWrappedConnection().getNativeConnection().getResource())('filtered_array', array | craue_without(excludedKeys), 3600) %}
How can I help you explore Laravel packages today?