Can't override homepage trailing slash - symfony

My site have no "homepage" that use the base url (mydomain.com)
The default routing include the _locale parameter, and thus, fail to match one part of the route depending on how I set it.
Config A
homepage:
path: /{_locale}/
defaults:
_locale: '%locale%'
requirements:
_locale: '%locales%'
This first config will match the route homepage with the following URLs
mydomain.com/en
mydomain.com/en/
But will fail to match
mydomain.com
mydomain.com/
Config B
homepage:
path: /{_locale}
defaults:
_locale: '%locale%'
requirements:
_locale: '%locales%'
This second config will match the route homepage with the following URLs
mydomain.com
mydomain.com/
mydomain.com/en
But will fail to match
mydomain.com/en/
Any idea what I'm missing in my config to match the 4 possibles URL patterns?

Found my answer:
homepage:
path: /{_locale}{trailingSlash}
defaults:
_locale: '%locale%'
trailingSlash: ''
requirements:
_locale: '%locales%'
trailingSlash: /?

Related

Symfony 4 optional locale/prefix only for one domain route

I'm trying to create prefix for only one domain in Symfony 4.
I would like to have following domains:
domain1.com
domain1.pl
domain2.com
**domain2.com/pl**
First option, I have tried
In /config/routes/annotations.yaml:
controllers:
resource: ../../src/Controller/
type: annotation
controllers_localized:
resource: ../../src/Controller/
type: annotation
prefix:
pl: /pl
en: /
But it adds to all domains prefixes and I want prefix only for domain2.com > domain2.com/pl
Second option, I have tried
In /config/routes.yaml route to the same controller:
index:
path: /
controller: App\Controller\DefaultController::index
index_localized:
path: /{_locale}
controller: App\Controller\DefaultController::index
defaults:
path: /pl
permanent: true
careers_localized:
path:
en: /careers
pl: /{_locale}/kariera
defaults:
path: /pl
permanent: true
controller: App\Controller\CareersController::careers
It works, but I have to change all anchors/link hrefs with if conditions in twig templates with additional /pl and add all Route cases in yaml which is time-consuming.
I wouldn't like to use bundles which was suggested for older Symfony versions

Locale as prefix and global for the whole site

I'm trying to define the routes of my site with {_locale} as a prefix so there will be routes like:
mysite.com/about-us
mysite.com/es/about-us
mysite.com/en/about-us
My first problem is that defining {_locale} as prefix makes it mandatory and the route mysite.com/about-us won't work. Currently defined this way:
#Acme/WebBundle/Resources/config/routing.yml
app_about_us:
path: /{_locale}/about-us
defaults: { _controller: AcmeWebBundle:Static:aboutUs, _locale: es}
requirements:
_locale: es|en
#app/config/routing.yml
Acme_web:
resource: "#AcmeWebBundle/Resources/config/routing.yml"
prefix: /
Also, I don't want my routes to display the {_locale}, so that if anyone types:
mysite.com/es/about-us it changes to *mysite.com
Finally if there is any way to set the prefix globally for all the site instead of putting it on every route would be awesome.
OK, first of all you can set default locale for a whole application
# app/config/config.yml
framework:
default_locale: en
Second - doing it this way, you can declare two routes:
app_about_us:
path: /{_locale}/about-us
defaults: { _controller: AcmeWebBundle:Static:aboutUs}
requirements:
_locale: es|en
app_about_us_locale:
path: /about-us
defaults: { _controller: AcmeWebBundle:Static:aboutUs, _locale: es}
Im not sure is it possible to do it different way without additional bundles, events etc...
Other way
You can set session locale - here is example to make locale sticky.
This way you can create normal routing, without params. So how set new session locale? Create special routing to setting new locale and redirect to your original page.
app_set_locale:
path: /{_locale}/
defaults: { _controller: AcmeWebBundle:Locale:setLocale}
inside controller set locale and redirect to previous page
Read Symfony documentation about Routing, Locale, Translate - maybe you will found something interesting :)

Use Symfony expression to populate default route parameters

I have route like this:
os_user_security_check:
pattern: /login_check
host: "{subdomain}.%base_host%"
defaults:
_controller: FOSUserBundle:Security:check
subdomain: "expr(request.get('subdomain'))"
requirements:
_method: POST
subdomain: "[a-z0-9\-_]+?"
What I want, is by default populate subdomain by default to prevent to affect it when generating the route, how ?

Symfony Match Route with Multiple Hosts

I know it is possible to filter a route by host, like this:
irc_backend.report.stacking_issue:
path: /reports/stacking-issues
host: backend.domain.com
defaults: { _controller: IRCBackendBundle:Reports/Product/StackingIssueReport:index }
Is it possible to alter this configuration to match multiple domains? For example:
irc_backend.report.stacking_issue:
path: /reports/stacking-issues
host: backend.domain.com|dev.backend.domain.com
defaults: { _controller: IRCBackendBundle:Reports/Product/StackingIssueReport:index }
I'm trying to avoid setting up 2 routes for every page.
You can try placeholders in your hostname with requirements (i.e.. Symfony Documentation)
irc_backend.report.stacking_issue:
path: /reports/stacking-issues
host: "{mydomaines}"
defaults: { _controller: IRCBackendBundle:Reports/Product/StackingIssueReport:index }
requirements:
mydomaines: backend.domain.com|dev.backend.domain.com
If you read the Symfony documentation, you'd know that you need to use placeholders. For your code, it would be :
irc_backend.report.stacking_issue:
path: /reports/stacking-issues
host: "{subdomain}.domain.com"
defaults:
_controller: IRCBackendBundle:Reports/Product/StackingIssueReport:index
subdomain: backend
requirements:
subdomain: backend|dev.backend
I hope it'll help you !
EDIT :
If you want your default subdomain to be the current one, you can use a parameter like this :
irc_backend.report.stacking_issue:
path: /reports/stacking-issues
host: "{subdomain}.domain.com"
defaults:
_controller: IRCBackendBundle:Reports/Product/StackingIssueReport:index
subdomain: "%subdomain%"
requirements:
subdomain: backend|dev.backend
Then you will be able to define this parameter in an Event listener with this line of code :
$container->setParameter("subdomain", $your_subdomain);
P-S : Don't forget to add the Service container to your listener's dependencies

Symfony 2 - can't configure application for hosts

I have problem with setting hosts for my symfony application. For now we have one domain, let's sey it was domain.pl for all four languages. So rule in YML was:
front_common:
resource: "#FrontCommonBundle/Resources/config/routing.yml"
prefix: /{_locale}
defaults: { _locale: pl }
requirements:
_locale: "[a-z]{2}"
front_common_locale:
path: /
defaults:
_controller: FrameworkBundle:Redirect:urlRedirect
_locale: pl
path: /pl
permanent: true
So if someone enters domain.pl, he/she will be redirected to domain.pl/pl. Other pages was domain.pl/en, domain.pl/de and so on...
Now we get another domain, let's say domain.eu, that should show only english version, so domain.eu show english, others still redirects to /pl /de etc. My routing now looks this way:
front_common_eu:
host: domain.eu
resource: "#FrontCommonBundle/Resources/config/routing.yml"
prefix: /
defaults: { _locale: en }
front_common:
resource: "#FrontCommonBundle/Resources/config/routing.yml"
prefix: /{_locale}
defaults: { _locale: pl }
requirements:
_locale: "[a-z]{2}"
front_common_locale:
path: /
defaults:
_controller: FrameworkBundle:Redirect:urlRedirect
_locale: pl
path: /pl
permanent: true
When I enter domain.pl it works fine, and redirects me to /pl. But when I enter domain.eu it works the same, it redirects me to /pl. If I remove fron_common_locale route, I've got 404. Help, what am I doing wrong?
PS. According to this: Routing prefix as follows the Virtual Host it should work...
Replace _locale on front_common_locale with:
_locale: pl|en

Resources