Подскажите, пожалуйста, как правильно впилить мультиязычность.
В строке адреса \домен\lang\controller\action\id
, если нет lang - редирект на "правильный" адрес. Язык по-умолчанию - вызов константы Config::SITE_LANGUAGE
Второй день траю, никак не идёт
index.php
ini_set('error_reporting', E_ALL);
require_once dirname(__DIR__) . '/vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();
spl_autoload_register(function ($class) {
$root = dirname(__DIR__);
$file = $root . '/' . str_replace('\\', '/', $class) . '.php';
if (is_readable($file)) {
require_once $file;
}
});
set_error_handler('Core\Error::errorHandler');
set_exception_handler('Core\Error::exceptionHandler');
$router = new Core\Router();
$router->addRoutes('', ['controller' => 'Home', 'action' => 'index']);
$router->addRoutes('{controller}', ['action' => 'index']);
$router->addRoutes('{controller}/', ['action' => 'index']);
$router->addRoutes('{controller}/{action}');
$router->addRoutes('{controller}/{action}/');
$router->addRoutes('{controller}/{action}/{id:\d+}');
$router->addRoutes('{controller}/{action}/{id:\d+}/');
$router->dispatch($_SERVER['QUERY_STRING']);
router.php
namespace Core;
/**
* Class Router
* @package Core
*/
class Router
{
protected $routes = [];
protected $parameters = [];
/**
* @param $route
* @param array $parameters
*/
public function addRoutes($route, $parameters = [])
{
$route = preg_replace('/\//', '\\/', $route);
$route = preg_replace('/\{([a-z]+)\}/', '(?P<\1>[a-z-]+)', $route);
$route = preg_replace('/\{([a-z]+):([^\}]+)\}/', '(?P<\1>\2)', $route);
$route = '/^' . $route . '$/i';
$this -> routes[$route] = $parameters;
}
/**
* @return array
*/
public function getRoutes()
{
return $this -> routes;
}
/**
* @return array
*/
public function getParameters()
{
return $this -> parameters;
}
/**
* @param $url
* @throws \Exception
*/
public function dispatch($url)
{
$url = $this->removeQueryStringVariables($url);
if ($this->matchRoutes($url)) {
$controller = $this -> parameters['controller'] . 'Controller';
$controller = $this -> convertToStudlyCaps($controller);
$controller = $this -> getNamespaces() . $controller;
if (class_exists($controller)) {
$controller_object = new $controller($this -> parameters);
$action = $this -> parameters['action'];
$action = $this -> convertToCamelCase($action);
if (is_callable([$controller_object, $action]) && !isset($this -> parameters['id'])) {
$controller_object -> $action();
}
elseif (is_callable([$controller_object, $action]) && isset($this -> parameters['id'])) {
$id = $this -> parameters['id'];
$controller_object -> $action($id);
}
else {
throw new \Exception("Метода $action (в контроллере $controller_object) нет");
}
} else {
throw new \Exception("Контроллер $controller не найден");
}
} else {
throw new \Exception('Роута нет', 404);
}
}
/**
* @param $url
* @return string
*/
protected function removeQueryStringVariables($url)
{
if ($url != '') {
$parts = explode('&', $url, 2);
if (strpos($parts[0], '=') === false) {
$url = $parts[0];
} else {
$url = '';
}
}
return $url;
}
/**
* @param $url
* @return bool
*/
public function matchRoutes($url)
{
foreach ($this -> routes as $route => $parameters) {
if (preg_match($route, $url, $matches)) {
foreach ($matches as $key => $match) {
if (is_string($key)) {
$parameters[$key] = $match;
}
}
$this -> parameters = $parameters;
return true;
}
}
}
/**
* @param $string
* @return mixed
*/
protected function convertToStudlyCaps($string)
{
return str_replace(' ', '', ucwords(str_replace('-', ' ', $string)));
}
/**
* @return string
*/
protected function getNamespaces()
{
$namespace = 'App\Controllers\\';
if (array_key_exists('namespace', $this -> parameters)) {
$namespace .= $this -> parameters['namespace'] . '\\';
}
return $namespace;
}
/**
* @param $string
* @return string
*/
protected function convertToCamelCase($string)
{
return lcfirst($this -> convertToStudlyCaps($string));
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
ЗдравствуйтеС modx revo знаком слабо, но есть задача: сделать закрытую страничку, доступ к которой будет только для авторизованных пользователей
Добрый день, появилась задача сделать одноразовую форму обратной связи, и я не могу решить, что лучше использовать кукки или сессию, для проверки...