6

I have defined a route as followed in my routing.yml file :

route_name:
    path: "/dashboard#messages/{id}"

However when I ask Symfony to generate that route, I get :

/dashboard%23messages/12345

How can I skip the encoding part of the route generation? Or how can I escape the # char in the path definition?

PS : Working with a (big) legacy system, I cannot change the urls.

Imanali Mamadiev
  • 2,604
  • 2
  • 15
  • 23
i.am.michiel
  • 10,281
  • 7
  • 50
  • 86

3 Answers3

11

Available from Symfony 3.2.

Support for anchors has been announced for the routing component using the fragment variable :

$this->get('router')->generate('user_settings', ['_fragment' => 'password']);

Will generate an url : /user/settings#password

For more information view the announcement.

dblack
  • 79
  • 8
i.am.michiel
  • 10,281
  • 7
  • 50
  • 86
  • With [KnpMenuBundle](https://github.com/KnpLabs/KnpMenuBundle): `$node->addChild('settings', ['route' => 'user_settings', 'routeParameters' =>['_fragment' => 'password']])` – Tony Chiboucas Dec 04 '17 at 18:45
2

You cannot easily - route parts are encoded unconditionally:

$url = strtr(rawurlencode($url), $this->decodedChars);

see at https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Routing/Generator/UrlGenerator.php#L192

Technically you might have extended the class UrlGenerator class and swap them using router.options.generator_class parameter. Then you could override the doGenerate method and replace %23 -> #.

zerkms
  • 249,484
  • 69
  • 436
  • 539
2

In twig

<a href="{{ path('user_settings', { '_fragment': 'password' }) }}">
Kaizoku Gambare
  • 3,143
  • 3
  • 29
  • 41