ibexa/templated-uri-bundle
Symfony bundle providing an RFC-6570 (URI Template) compatible router and URL generator via hautelook/TemplatedUriRouter. Exposes a templated router service to generate links like /demo?{&page}{&sort*}{&filter*} from route params.
Installation:
composer require ibexa/templated-uri-bundle
For Symfony Flex, the bundle auto-registers in config/bundles.php. For older Symfony versions, add to AppKernel.php:
new Hautelook\TemplatedUriBundle\HautelookTemplatedUriBundle(),
First Use Case:
Generate a templated URI for a route named app_homepage with dynamic query parameters:
$router = $this->get('hautelook.router.template');
$uri = $router->generate('app_homepage', [
'page' => '{page}',
'sort' => ['{sort}'],
'filter' => ['{filter}']
]);
// Outputs: `/homepage?{&page}{&sort*}{&filter*}`
Where to Look First:
hautelook.router.template (injected via autowiring or container).config/routes.yaml with _templated_uri: true if custom behavior is needed.{&page}, {+path}).Basic URI Generation:
// In a controller or service
$uri = $this->router->generate('route_name', [
'query' => '{query}',
'page' => ['{page}']
]);
// Output: `/route?{&query}{&page}`
Dynamic Query Parameters:
?key=val1&key=val2):
$uri = $this->router->generate('products', [
'filter' => ['category={category}', 'price={price}']
]);
// Output: `/products?filter=category={category}&filter=price={price}`
{¶m}: Preserves existing params (e.g., /search?{&query}).{+param}: Appends to path (e.g., /base/{+id} → /base/123).*: Repeats for arrays (e.g., {sort*} → ?sort=asc&sort=desc).Integration with Symfony Router:
app_product_show).RouterInterface for hybrid routing:
$symfonyUri = $this->router->generate('symfony_route');
$templatedUri = $this->templatedRouter->generate('templated_route');
HATEOAS Integration:
BazingaHateoasBundle to generate templated links in API responses:
use Bazinga\Hateoas\Generator\UrlGenerator;
$link = $this->hateoasUrlGenerator->generate('route_name', [
'page' => '{page}'
]);
Twig Integration:
{% set uri = app.service('hautelook.router.template').generate('route_name', {'page': '{page}'}) %}
<a href="{{ uri }}">Link</a>
API Pagination:
$nextPageUri = $this->router->generate('api_products', [
'page' => '{page=2}' // Defaults to 2 if not provided
]);
Filterable Lists:
$filteredUri = $this->router->generate('api_users', [
'filter' => ['role={role}', 'status={status}']
]);
Legacy URL Migration:
// Before
$oldUrl = '/products?page=' . $page;
// After
$newUrl = $this->router->generate('api_products', ['page' => '{page}']);
Conditional Templating:
$uri = $useTemplate
? $this->router->generate('route_name', ['param' => '{param}'])
: $this->router->generate('route_name', ['param' => $value]);
Route Configuration:
config/routes.yaml with _templated_uri: true for custom behavior:
api_products:
path: /products
defaults: { _controller: 'App\Controller\ProductController::index', _templated_uri: true }
Dependency Injection:
use Hautelook\TemplatedUriRouter\Router\RouterInterface;
public function __construct(private RouterInterface $templatedRouter) {}
Testing:
public function testUriGeneration()
{
$router = $this->get('hautelook.router.template');
$uri = $router->generate('route_name', ['page' => '{page}']);
$this->assertEquals('/route?{&page}', $uri);
}
Performance:
$cacheKey = 'uri_' . md5(serialize($params));
$uri = $this->cache->get($cacheKey, function() use ($params) {
return $this->router->generate('route_name', $params);
});
Validation:
use Hautelook\TemplatedUriRouter\Validator\Validator;
$validator = new Validator();
$isValid = $validator->validate($template);
Unclosed Braces:
{param) causes malformed URIs.Hautelook\TemplatedUriRouter\Validator).Reserved Characters:
&, =, or + may break if not escaped.$encodedValue = urlencode($value);
$uri = $this->router->generate('route', ['param' => '{' . $encodedValue . '}']);
Symfony Router Conflict:
_templated_uri only when needed.Array Expansion:
// Bad: ['{key}' => $value] (key may not be expanded)
// Good: ['key' => '{value}']
PHP Version:
Missing Dependencies:
preg functions are required but may be disabled in php.ini.extension=php_pcre is enabled.Invalid Templates:
var_dump($router->generate('route', $params)) to inspect output.Route Not Found:
RouteNotFoundException.config/routes.yaml.Parameter Expansion:
{sort*} ignores values).$uri = $router->generate('route', ['sort' => ['{asc}', '{desc}']]);
Caching Issues:
php bin/console cache:clear
How can I help you explore Laravel packages today?