/
LocaleController.php
88 lines (79 loc) · 3.21 KB
/
LocaleController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/**
* This file is part of the LuneticsLocaleBundle package.
*
* <https://github.com/lunetics/LocaleBundle/>
*
* For the full copyright and license information, please view the LICENSE
* file that is distributed with this source code.
*/
namespace Lunetics\LocaleBundle\Controller;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Lunetics\LocaleBundle\Validator\MetaValidator;
/**
* Controller for the Switch Locale
*
* @author Matthias Breddin <mb@lunetics.com>
* @author Christophe Willemsen <willemsen.christophe@gmail.com>
*/
class LocaleController
{
private $router;
private $metaValidator;
private $useReferrer;
private $redirectToRoute;
/**
* @param RouterInterface $router Router Service
* @param MetaValidator $metaValidator MetaValidator for locales
* @param bool $useReferrer From Config
* @param null $redirectToRoute From Config
* @param string $statusCode From Config
*/
public function __construct(RouterInterface $router = null, MetaValidator $metaValidator, $useReferrer = true, $redirectToRoute = null, $statusCode = '302')
{
$this->router = $router;
$this->metaValidator = $metaValidator;
$this->useReferrer = $useReferrer;
$this->redirectToRoute = $redirectToRoute;
$this->statusCode = $statusCode;
}
/**
* Action for locale switch
*
* @param Request $request
*
* @throws \InvalidArgumentException
* @return RedirectResponse
*/
public function switchAction(Request $request)
{
$_locale = $request->attributes->get('_locale', $request->getLocale());
$statusCode = $request->attributes->get('statusCode', $this->statusCode);
$useReferrer = $request->attributes->get('useReferrer', $this->useReferrer);
$redirectToRoute = $request->attributes->get('route', $this->redirectToRoute);
$metaValidator = $this->metaValidator;
if (!$metaValidator->isAllowed($_locale)) {
throw new \InvalidArgumentException(sprintf('Not allowed to switch to locale %s', $_locale));
}
// Redirect the User
if ($useReferrer && $request->headers->has('referer')) {
$response = new RedirectResponse($request->headers->get('referer'), $statusCode);
} elseif ($this->router && $redirectToRoute) {
$target = $this->router->generate($redirectToRoute, array('_locale' => $_locale));
if ($request->getQueryString()) {
if (!strpos($target, '?')) {
$target .= '?';
}
$target .= $request->getQueryString();
}
$response = new RedirectResponse($target, $statusCode);
} else {
// TODO: this seems broken, as it will not handle if the site runs in a subdir
// TODO: also it doesn't handle the locale at all and can therefore lead to an infinite redirect
$response = new RedirectResponse($request->getScheme() . '://' . $request->getHttpHost() . '/', $statusCode);
}
return $response;
}
}