Im trying to create a cms with Symfony. I want users to be able to create their own pages. I got this all set up but what did not work for me was loading pages with an url that contains a /
.
This is my route that does not allow a /
:
#[Route('/{slug}', name: 'dynamic_page', defaults: ["slug" => null], methods: ['GET'])]
public function showStoredPage(Page $page)
{
return $this->render('blocks/base.html.twig');
}
If I add requirements: ["slug" => ". "]
to my route, I am able to go to any/route/that/exists
with as many slashes as I wish. Which is what I want.
But after adding this I figured that my debug toolbar does not load anymore. The debug bar shows loading...
in all pages I have. Also, when looking at the text the symfony built-in server shows in cmd, it keeps looping a request. If I wait long enough the server even crashes because it can never load the toolbar...
How can I make my toolbar load but also keep my route dynamic the way I want it? I'm using Symfony 5.4 with PHP 8 .
CodePudding user response:
It appears this can be solved very easily. I just had to add priority: -1
to my route attribute. Now it looks like this:
#[Route('/{slug}', name: 'dynamic_page', defaults: ["slug" => null], requirements: ["slug" => ". "], methods: ['GET'], priority: -1)]
Also with the command php bin/console debug:router
you can now see the route is on the bottom of the table and the toolbar will load first.
CodePudding user response:
For more control over what the route does, and does not match, without having to rely on the priority setting, you can use a more precise regex. You can use a negative lookahead to define what not to match. All the paths you want to avoid start with '_'
so, you could use '(?!_). '
but that will prevent you from matching anything starting with '_'
. To only exclude the defined routes use '(?!_(error|wdt|profiler)). '
#[Route('/{slug}', name: 'dynamic_page', defaults: ["slug" => null], requirements: ["slug" => "(?!_(error|wdt|profiler)). "], methods: ['GET']]