Просмотр поста

.
Delphinum

ДоХтор, ну если ты работал через файлы, я так и продолжу:

<?php
// Model
/**
 * Создает ссылку.
 *
 * @param string $href Адрес ссылки.
 * @param string $label Текст ссылки.
 * @param int $clickLimit Число допустимых кликов по ссылке.
 *
 * @return array Структура ссылки.
 */
function createLink($href, $label, $clickLimit = 10){
  return [
    'href' => $href,
    'label' => $label,
    'currentClicks' => 0,
    'clickLimit' => 10,
    'added' => time(),
  ];
}

/**
 * Загружает конфигурацию ссылки из файла.
 *
 * @param string $file Адрес файла, хранящего конфигурацию ссылки.
 *
 * @return array|null Конфигурация ссылки.
 */
function loadLink($file){
  if(!file_exists($file)){
    return null;
  }
  return unserialize(file_get_contents($file));
}

/**
 * Сохраняет конфигурацию ссылки в файл.
 *
 * @param string $file Целевой файл.
 */
function saveLink($file){
  file_put_contents(serialize($file));
}

// View
function renderLink(array $link){
  return '<a href="' . $link['href'] . '">' . $link['label'] . '</a>';
}

// Controller
function route($regex, callable $handler){
  $match = [];
  if(preg_match($regex, $_SERVER['REQUEST_URI'], $match) === false){
    return $handler($match);
  }
  return false;
}
?>


Использование:
<?php
// Заход на главную страницу
route('/', function(array $match){
  // Получаем ссылку или создаем новую
  $link = loadLink('test.link');
  if(is_null($link)){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }

  echo renderLink($link);
});

// Заход на страницу со ссылкой
route('?link=test', function(array $match){
  $link = loadLink('test.link');
  // Если такой ссылки еще нет, просто создаем новую
  if(is_null($link)){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }
  // Если ссылка была создана более дня назад, обновляем ее
  elseif(($link['added'] - (new DateTime('+1 day'))->getTimestamp()) < time()){
    $link = createLink('http://site.com?link=test', 'текст', 15);
  }

  // Сохраняем и отображаем ссылку
  $link['currentClicks']++;
  saveLink($link);
  echo renderLink($link);
});
?>


Не знаю, рабочий ли это код, но надеюсь смысл будет понятен.