custom regex in route requirements - symfony

I'm trying to make a route parameter match an alphanumeric value that's 3 to 15 characters long. Code looks like this:
TestBundle_new:
pattern: /message/new/{name}
defaults: { _controller: TestBundle:Message:new }
requirements:
name: [a-zA-Z0-9]{2,15}
Unfortunately routing.yml fails to load. I was wondering if there is anything I can do to make this work?

You need to add quotes around your pattern.
name: "[a-zA-Z0-9]{2,15}"

Related

Variable in route by default working properly but not visible in URL it typed

Thanks to my URL I can know what language and which article the user is looking for instance: article/id_aritlce/Title_of_article/FR
In case the user doesn't write the url with the language information I settle default value in the routing.yml file.
Site_Article:
path: /article/{id}/{article_title}/{language}
defaults: {_controller: SiteBlogBundle:Blog:article, language: EN}
it is working just fine....
but if I type in the URL article/3/Titleofarticle/EN, then EN disapear from the URL. which is not what I want. (I still get the right page, which is with the EN language being display, but still would like to see it in the URL.)
You can not provide default value for en locale and it always be in url when you type it.
But in this case to enable route /article/{id}/{article_title} without any locale you need to create one more route that will not have this parameter at all. In this case Symfony will choose locale based on your fallback_locale parameter that you set in config.yml
Your routing config must look like this:
Site_Article_With_Locale:
path: /article/{id}/{article_title}/{_locale}
defaults: {_controller: SiteBlogBundle:Blog:article}
Site_Article:
path: /article/{id}/{article_title}
defaults: {_controller: SiteBlogBundle:Blog:article}

How to allow a "?" character in a route parameter in Symfony2?

I would like to know how to allow a "?" character in a route parameter in Symfony2. This is the route that I have (actually, the route parameter I am focusing on is "messtext"):
ikproj_groupe_sendreply1:
pattern: /{groupid}/{receiver}/{messtext}/{cible}/sendreply
defaults: { _controller: IkprojGroupeBundle:Messages:SendReply1 }
requirements:
messtext: .+
In fact, I had a look at this link: http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html which is about how to allow a "/" character in a route parameter in Symfony2. I did what I learnt from that tutorial exactly but the problem is that it doesn't work: Symfony2 still displays this error message:
No route found for "GET /groupe/sendreply/11/28/hello,%20dear%20sir...can%20I%20join%20your%20group"
So, my questions are: what is wrong in my code above and how can I resolve that?
Only 1 parameter of your route may accept '/' character. And this MUST be the last one as every following one are considered as part of the param value... In your case, Symfony routing never detect cible and sendreply parts of the URL.
Try to put messtext param at the very end of the URL :
ikproj_groupe_sendreply1:
pattern: /{groupid}/{receiver}/{cible}/sendreply/{messtext}
defaults: { _controller: IkprojGroupeBundle:Messages:SendReply1 }
requirements:
messtext: .+

Is there way to use UTF-8 modifer in Symfony2 routing?

I have following route:
library_filter_by_genre:
path: /library/genre/{genre}/
defaults: { _controller: noxaeternaMainBundle:Library:filterByGenre }
requirements:
genre: "^[-_\w\d]+$"
It of course works excellent, but I need UTF-8 support. So I've thought that adding of modifer will allow me to use UTF-8, but with the u modifer route doesn't work even with English letters and numbers. I see error:
No route found for "GET /library/genre/123abc/"
Thanks for reading, I hope you can help.

symfony2 special routes wildcard nothing else

problem:
need to have urls like this:
wall:
pattern: /{username}/
But.. it match every url like /Messages/, /Settings/
And only solution which comes to mind is to check if this user exists... and if no redirect to the real /Settings ? But its one select for each page and i dont like it.
Is there any other way? + i also probably need to denied register users with routes patterns? How?
AND NO I DONT WANT TO ADD TO URL SOMETHING LIKE /User/{username}
According to my comment, this could be a workaround:
pages:
pattern: /{page}/
requirements:
page: "(Messages|Settings|SomeOtherPage|YetAnotherPage)"
wall:
pattern: /{username}/
Basically, it requires that Page (Settings, Messages, etc) starts with uppercase ([A-Z]) and the rest of page name is not important.
As for the user-profile pages, they should start explicitly with lowercase character ([a-z]).
I don't know if this suffices your requirements...
EDIT:
This is in fact a bit simplified solution of #tomas.pecserke. I have just edited routing so all the pages are enumerated in single route.
I strongly recommend against this approach. You should definetly prefix the route. But if you must do it this way, you can specify other routes first. RouteMatcher chooses the first route that matches the pattern.
# src/Acme/DemoBundle/Resources/routing.yml
account:
pattern: /account
defaults: # ...
some_other_route:
pattern: /some_other_route
defaults: # ...
wall:
pattern: /{username}/
defaults: # ...
# you can set requirements
requirements:
username: [a-z0-9]+ # regular expression

Symfony2 access_control, Match all routes containing some word

The following only matches a path that starts with private:
access_control:
#...
- { path: ^/private, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
- { path: ^/private, roles: ROLE_NO_ACCESS }
How can I match all the routes that contain /private/ (and do not necessarily start with private)? For example, something that will match /message/private/blabla..
the equivalent of [path~="private"] with jQuery selectors.
Note: Does anyone know how we call the regex we are using here? Is this specific to yml or is this implemented by Symfony, I am confused.
Is there a chance I missed this in the doc somewhere, I mean the description with the specific matching patterns like start with, end with, contains etc....
^/ this pattern says everything that starts (^) with slash (/) and so on.
I suppose that /private or something like */private should work

Resources