. */ declare(strict_types=1); /** * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). * * Copyright (C) 2019 Jan Böhmer (https://github.com/jbtronics) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ namespace App\Controller; use App\Entity\UserSystem\User; use function function_exists; use function in_array; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Contracts\Translation\TranslatorInterface; class RedirectController extends AbstractController { protected $default_locale; protected $translator; protected $session; protected $enforce_index_php; public function __construct(string $default_locale, TranslatorInterface $translator, SessionInterface $session, bool $enforce_index_php) { $this->default_locale = $default_locale; $this->session = $session; $this->translator = $translator; $this->enforce_index_php = $enforce_index_php; } /** * This function is called whenever a route was not matching the localized routes. * The purpose is to redirect the user to the localized version of the page. * * @return RedirectResponse */ public function addLocalePart(Request $request): RedirectResponse { //By default we use the global default locale $locale = $this->default_locale; //Check if a user has set a preferred language setting: $user = $this->getUser(); if (($user instanceof User) && ! empty($user->getLanguage())) { $locale = $user->getLanguage(); } //$new_url = str_replace($request->getPathInfo(), '/' . $locale . $request->getPathInfo(), $request->getUri()); $new_url = $request->getUriForPath('/'.$locale.$request->getPathInfo()); //If either mod_rewrite is not enabled or the index.php version is enforced, add index.php to the string if (($this->enforce_index_php || ! $this->checkIfModRewriteAvailable()) && false === strpos($new_url, 'index.php')) { //Like Request::getUriForPath only with index.php $new_url = $request->getSchemeAndHttpHost().$request->getBaseUrl().'/index.php/'.$locale.$request->getPathInfo(); } return $this->redirect($new_url); } /** * Check if mod_rewrite is available (URL rewriting is possible). * If this is true, we can redirect to /en, otherwise we have to redirect to index.php/en. * When the PHP is not used via Apache SAPI, we just assume that URL rewriting is available. * * @return bool */ public function checkIfModRewriteAvailable(): bool { if (! function_exists('apache_get_modules')) { //If we can not check for apache modules, we just hope for the best and assume url rewriting is available //If you want to enforce index.php versions of the url, you can override this via ENV vars. return true; } //Check if the mod_rewrite module is loaded return in_array('mod_rewrite', apache_get_modules(), false); } }