За последние 24 часа нас посетили 22022 программиста и 987 роботов. Сейчас ищут 653 программиста ...

Доработать логику, если дефолтные и входящие параметры - null

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 16 дек 2020.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    PHP:
    1. <?php
    2.  
    3.  
    4. namespace core;
    5.  
    6.  
    7. class Cache
    8. {
    9.     public static function set($file, $data, $time = '15 minutes')
    10.     {
    11.         $cache_path = 'tmp/caches/';
    12.         if (!is_dir($cache_path)) {
    13.             mkdir($cache_path, 0777, true);
    14.         }
    15.         $cache_file = $cache_path . $file . '.txt';
    16.         file_put_contents($cache_file, serialize($data));
    17.         touch($cache_file, strtotime('now + ' . $time));
    18.     }
    19.  
    20.     public static function get($file, $key = null, $value = null)
    21.     {
    22.         $cache_file = "tmp/caches/{$file}.txt";
    23.         if (is_file($cache_file)) {
    24.             if (time() <= filemtime($cache_file)) {
    25.  
    26.                 // НАЧИНАЕМ - тут всё понятно: забираем содержимое файла
    27.                 $content = unserialize(file_get_contents($cache_file));
    28.  
    29.                 // Если необязательный параметр $key указан, НО его значение, например, null, то условие не выполнится
    30.                 if ($key) {
    31.                     $content = is_array($content) ? array_column($content, null, $key) : null;
    32.                 }
    33.  
    34.                 // Если необязательный параметр $value указан, НО его значение, например, null, то условие не выполнится
    35.                 if ($value) {
    36.                     $content = $content[$value] ?? null;
    37.                 }
    38.  
    39.                 return $content;
    40.             }
    41.             unlink($cache_file);
    42.         }
    43.         return false;
    44.     }
    45.  
    46.     public static function unlink($file)
    47.     {
    48.         $cache_file = "tmp/caches/{$file}.txt";
    49.         if (is_file($cache_file)) {
    50.             unlink($cache_file);
    51.         }
    52.         return false;
    53.     }
    54. }
    Пример: есть кеш массива объектов Country, выполняем:

    PHP:
    1. <?php
    2.  
    3. $country_id = filter_input(INPUT_POST, 'country_id');
    4. $country = Cache::get('country', 'id', $country_id);
    5. if (!$country) {
    6.     throw new App('Вы не ввели или неправильно ввели данные');
    7. }
    Если мы не выбрали в форме чекбокс country_id, то на приёме у нас $country_id = null, следовательно в параметр Cache::get(..., ..., $country_id) улетел null, условие if ($value) {$content = $content[$value] ?? null;} не выполнилось и нам вернулось if ($key) { $content = is_array($content) ? array_column($content, null, $key) : null; }, то есть вернулся массив объектов пересортированный по id И наша проверка if (!$country) {throw new App('Вы не ввели или неправильно ввели данные');} не отработала.

    Как можно доработать проверки Cache::get(), может быть кто-то захочет поделиться мыслями или опытом?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    не очень понятно - на кой ляд все это нужно.

    объект Кэш - он только и должен уметь - сохранять кеш, проверять - не протух ли и выдавать сохраненные данные....

    а вы пытаетесь впихнуть внутрь валидатор, чтоб кеш еще какие то значения проверял.... не надо это

    логика такая

    1. получили данные

    2. получили кеш или получили что уже нет кеша

    3. отдельно проверили какие-то свои условия (есть ли в кеше данные какие то или еще чего там)

    А валидатор отдельным классом пишите.... оченно пригодиться не только для кеша но и для проверки вводимых значений
    --- Добавлено ---
    непонятно какой unlink - родной или расширенный вами, если второе то вызов self::unlink()
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    по пунктам 1,2,3 да, сам уже за ночь переболел и выкинул нафиг, а метод self::unlink() - это просто запасной метод, вдруг админу приспичит внести изменения в закешированные данные, а кеш на год стоит, так он сам сможет его удалить для обновления данных и сам этот метод в self::get() не используется, потому что две проверки тогда будет на файл кеша, просто функцией удаляю, метод self::unlink() - просто резерв

    согласен, не нужна разная дичь, получаем данные из кеша, а всё остальное делаем по месту

    решено
     
    #3 Вероломство, 16 дек 2020
    Последнее редактирование: 16 дек 2020