Installation
Add the bundle to your composer.json:
composer require masando/edemy-linkbundle
Register the bundle in config/bundles.php:
return [
// ...
Masando\eDemyLinkBundle\eDemyLinkBundle::class => ['all' => true],
];
First Use Case Generate a link in a controller or template:
use Masando\eDemyLinkBundle\LinkGenerator;
$link = $this->get('link_generator')->generate('route_name', ['param' => 'value']);
Or in Twig:
{{ path('route_name', {'param': 'value'}) }}
Key Files
src/Masando/eDemyLinkBundle/Resources/config/services.yml (Service definitions)src/Masando/eDemyLinkBundle/LinkGenerator.php (Core logic)Route-Based Link Generation
// Controller
$url = $this->get('link_generator')->generate('app_homepage');
Dynamic Route Parameters
$url = $this->get('link_generator')->generate('product_show', [
'slug' => $product->slug,
'id' => $product->id
]);
Twig Integration
{# Default route #}
<a href="{{ path('route_name') }}">Link</a>
{# With parameters #}
<a href="{{ path('route_name', {'id': product.id}) }}">Link</a>
Link Generation in Forms
<form action="{{ path('product_update', {'id': product.id}) }}" method="POST">
{{ form_widget(form) }}
</form>
Custom Link Types
Extend LinkGenerator to support non-route links (e.g., external URLs):
class CustomLinkGenerator extends LinkGenerator {
public function generateExternal($url) {
return $this->urlGenerator->generate($url);
}
}
Link Validation
if ($this->get('link_generator')->isValidRoute('route_name')) {
// Safe to generate
}
Link Caching Cache generated links in a service:
$cacheKey = 'link_route_name_' . md5(serialize($params));
$url = $this->get('cache')->get($cacheKey, function() use ($params) {
return $this->get('link_generator')->generate('route_name', $params);
});
Route Existence
generate() throws RouteNotFoundException if the route doesn’t exist.try {
$url = $this->get('link_generator')->generate('route_name');
} catch (\InvalidArgumentException $e) {
$url = '#'; // Fallback
}
Parameter Mismatch
InvalidArgumentException.route() helper in Twig for stricter validation:
{% if 'route_name' is route %}
<a href="{{ path('route_name', {'id': product.id}) }}">Link</a>
{% endif %}
Twig vs. PHP Context
path() uses Symfony’s UrlGenerator, not the bundle’s LinkGenerator.LinkGenerator into Twig extensions for custom logic.Check Route Dump
php bin/console debug:router
Verify route names and required parameters.
Enable Debug Mode
Set APP_DEBUG=true in .env to see detailed exceptions.
Log Generated Links
$this->get('logger')->debug('Generated link', ['url' => $url]);
Custom Link Generators
Override LinkGenerator in a child bundle:
# config/services.yml
services:
app.link_generator:
class: AppBundle\Service\CustomLinkGenerator
arguments: ['@router']
tags: ['link_generator']
Add Link Filters
Extend LinkGenerator to modify URLs (e.g., add query strings):
public function generate($route, $params = []) {
$url = parent::generate($route, $params);
return $url . '?utm_source=app';
}
Event Listeners
Listen to kernel.request to log or modify links dynamically:
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
$this->get('logger')->info('Current link: ' . $request->getUri());
}
Default Parameters
Set global defaults in config/packages/edemy_link.yaml:
edemy_link:
defaults:
_locale: '%locale%'
_controller: 'App\Controller\DefaultController::index'
Environment-Specific Routes
Use %kernel.environment% in route parameters:
# config/routes.yaml
app_homepage:
path: /
defaults:
_route: 'home_%env(DEFAULT::dev)%'
How can I help you explore Laravel packages today?