2017-02-07 23 views
1

У меня есть некоторые настройки, хранящиеся в таблице базы данных mysql «Настройки» для веб-приложения php. Таблица имеет два столбца, просто «option_name» и «option_value». Я построить класс, чтобы восстановить или изменить эти параметры (обычно изменяется через флажки) и мне было интересно, если это можно было бы считать хорошим подход:Управление параметрами приложения php, хранящимися в базе данных

class Settings { 
    public function __construct(PDO $db_connection) { 
     $this->db_connection = $db_connection; 
    } 

    public function getValue($setting_name) { 
     $sql = "SELECT option_value FROM settings WHERE option_name = ?"; 
     $stmt = $this->db_connection->prepare($sql); 
     $stmt->execute([$setting_name]); 
     return $stmt->fetchColumn(); 
    } 

    public function setValue($setting_name, $value) { 
     // Some code here to sanitize value 
     if (!is_bool($value)) { 
      throw new InvalidArgumentException("value must be boolean"); 
     } 
     $sql = "UPDATE settings SET option_value = ? WHERE option_name = ?"; 
     $stmt = $this->db_connection->prepare($sql); 
     return $stmt->execute([$value, $option_name)]; 
    } 
} 

Таким образом, каждый раз, когда используется метод, запрос отправляется в базу данных. Также класс является просто «оберткой» для запросов. Является ли это хорошим способом управления настройками? Я хотел бы услышать некоторые предложения

+3

Трудно сказать, без дополнительной информации. Сколько настроек есть? Я бы, наверное, загрузил их все сразу. – jeroen

ответ

1

Я использовал такое решение, и он работал очень хорошо для меня в некоторых веб-приложениях.

По моему опыту, запросы к этой таблице растут по количеству и времени выполнения, когда вы начинаете вводить в нее все больше и больше настроек, поэтому я обычно делал для них какие-то кеширование памяти (если фреймворк не делает это для вас). Хотя некоторые говорили бы, что индексирование option_name сделает запросы незначительными, на стороне профилирования их влияние можно увидеть.

что кэш заполняется на время запуска, и обновляется на SetValue (и вставки), поэтому выбирает не нужно будет выдаваться на ПолучитьЗначение. Проблема только в том, что если вы вручную измените значение через БД (или ваш сценарий миграции), кеш нужно обновить. Несколько узлов одного приложения делают это еще более сложным, но это можно сделать.

Несмотря на это, если ваше приложение нуждается в таких динамических изменениях конфигурации или у вас есть несколько настроек для нескольких экземпляров приложения, которое я бы сказал, для этого. У вас есть гибкость времени выполнения, и дампы базы данных будут захватывать эти параметры, поэтому вам не придется извлекать их из некоторых внешних файлов.

P.S. Извините за длинный ответ, это мой первый в StackOverflow. Повеселись!

+0

Спасибо, это было действительно полезно – Egidiux

 Смежные вопросы

  • Нет связанных вопросов^_^