Загрузите файл конфигурации только один раз

Я работаю над своим сценарием, чтобы преобразовать устаревшие ссылки в SEO дружественные ссылки.

index.php

require 'AltoRouter.php';
$router = new AltoRouter();
$router->setBasePath('/router');

$urls = [
'index.php?option=com_index&task=articles&id=1',
'index.php?option=com_index&task=articles&slug=1-article-title',
'index.php?option=com_index&task=articles.category&cid=100-category1',
'index.php?option=com_shop&task=products&slug=100-amazing-product',
];

foreach($urls as $i=>$url) {
echo $router->getSefUrl($url);
}

AltoRouter.php

...
public function getSefUrl($url) {

$url_clean  = str_replace('index.php?', '', $url);
parse_str($url_clean, $output);

$component  = empty($output['option'])  ? 'com_index'   : $output['option'];
$task               = empty($output['task'])        ? 'index'           : $output['task'];

$path           = 'components/'.$component.'/routes/routes.json';
$data           = json_decode(file_get_contents($path));

if (!empty($data)) {
foreach($data as $route) {
$this->map($route[0], $route[1], $route[2], $route[2]);
}
}

$route_info = $this->findUrlFromRoutes($task);
return empty($route_info) ? $url : $this->generate($route_info->task, $output);
}
...

Мой вопрос: каждый раз, когда я использую getSefUrl Метод Я загружаю маршруты из внешнего файла. Это нормально? Или я могу оптимизировать код выше какой-то? Если да — как?
Спасибо!

0

Решение

Вы можете избежать нескольких выборок и декодирований в вашем цикле, разбив это.

В AltoRouter.php

private $routes = array();

function getComponentRoutes($component)
{
if(! isset($this->routes[$component])) {
$path = 'components/'.$component.'/routes/routes.json';
$this->routes[$component] = json_decode(file_get_contents($path));
}

return $this->routes[$component];
}
1

Другие решения

Вы можете заменить то, что требует, на require_once или лучше использовать автозагрузку:

Вы можете определить функцию __autoload (), которая вызывается автоматически
в случае, если вы пытаетесь использовать класс / интерфейс, который не был
определены еще. При вызове этой функции скриптовый движок получает
последний шанс загрузить класс до того, как PHP потерпит неудачу с ошибкой.

Создайте папку и поместите все необходимые классы в эту папку:

function __autoload($class) {
require_once "Classes" . $class . '.php';
}
0