Переносим системные константы в базу данных

 

Всем доброго времени суток. Сегодня мы с Вами реализуем одну очень важную вещь, которую стоило бы реализовать с самого начала. По задумке, в CMS RS-MINI будет возможность обновление движка в полуавтоматическом режиме (обновление придется скачивать самим, а не через спец написанный скрипт). Апдейтер должен будет, после обновления, поменять версию движка, что в данной ситуации немного проблематично, так как номер версии храниться в файле /project/conf/config.class.php, и прописывается прям руками в константу VERSION.

Дабы облегчить нам способ смены одного номера версии на другой, было решено вынести некоторые системные константы, прямо в базу данных (править БД легче, чем парсить файл). Так же данное изменение позволит нам в будущем управлять некоторыми важными настройками системы прям из админ панели движка, что явно облегчит управление CMS'ой

Новая таблица в базе данных

Для начала предлагаю создать таблицу в которой мы будем хранить информацию для формирования необходимых системных констант.

Табличка будет состоять всего из трех полей:

  • id
  • имя
  • значение

Для начала нам достаточно будет вынести всего три константы, а именно:

  • DOM — управление просмоторщиком содержимого объекта класса dom.class.php
  • CMS — имя нашей системы
  • VERSION — версия нашей системы

Давайте составим и исполним скуль запрос на создание таблицы и заполнение ее необходимой информацией:

CREATE TABLE IF NOT EXISTS `rs_constant` (
    `constant_id` int(11) NOT NULL AUTO_INCREMENT,
    `constant_name` varchar(255) NOT NULL,
    `constant_value` varchar(255) NOT NULL,
    PRIMARY KEY (`constant_id`)
)

ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

INSERT INTO
    `rs_constant`
        (
            `constant_id`,
            `constant_name`,
            `constant_value`
        )
    VALUES
        (
            1,
            'DOM',
            'TRUE'
        ),
        (
            2,
            'CMS',
            'RS-MINI'
        ),
        (
            3,
            'VERSION',
            '0.0.1'
        )
;

Класс config.class.php

Так как теперь константы будут поднимаются из базы данных, то подключение к mysql серверу нужно производить именно в этом классе (в config.class.php) а не в application.class.php.

Так же решено было отказаться от свойства self::$db в классе config.class.php (если Вы не помните, В этом свойстве хранятся настройки для подключения к базе данных). На смену свойства придут четыре константы:

  • DB_SERVER — сервер базы
  • DB_USER — юзер базы
  • DB_PASS — пароль юзера
  • DB_NAME — имя базы

поэтому нам так же придется подправить класс sql.class.php, но для начала давайте реализуем получение и регистрацию констант. Вот так теперь выглядит класс config.class.php (файл лежит в папке /project/conf/)

<?php

/*
 * @package RS-MINI
 * @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
 * @license GNU General Public License version 2; see LICENSE.txt
 *
 */

namespace conf;

if(!defined('RS-MINI')) die();

/*
 * config v 1.0
 *
 * класс с настройками движка
 *
 */

class config
{
    /*
     * установка настроек движка
     *
     * @access - public
     */
    
    public static function setConfig()
    {
        // получаем и регаем константы проекта
        self::setConstant();
    }
    
    /*
     * метод запрашивает и запоминает константы проекта
     *
     * @access - private
     * @return - boolean
     */
    
    private static function setConstant()
    {
        // константы БД
        define('DB_SERVER',         'localhost');                             // сервер БД
        define('DB_USER',           'root');                                  // юзер БД
        define('DB_PASS',           '123456');                                // пароль БД
        define('DB_NAME',           'rs_mini');                               // имя БД
        
        // стартуем подключение к БД
        \core\sql::setConnect();
        
        // получаем список констант
        if (!$constantList = \core\sql::query('SELECT * FROM rs_constant')->fetch())
            // если списка нет, то выводим false
            return FALSE;
            
        // листаем список
        foreach ($constantList as $constant) {
            // пытаемся определить булевое ли значение
            switch (mb_strtolower($constant['constant_value'])) {
                // если значение равно 'true'
                case 'true':
                    // приводим к булю
                    $value = TRUE;
                    break;
                    
                // если значение равно 'false'
                case 'false':
                    // приводим к булю
                    $value = FALSE;
                    break;
                    
                // по умолчанию
                default:
                    // сохраняем значение константы без изменений
                    $value = $constant['constant_value'];
                    break;
            }
            
            // регистрируем константу
            define($constant['constant_name'], $value);
        }
        
        return TRUE;
    }
}

Тут нет ничего сложного, но есть один момент который хотелось бы прокомментировать. Обратите внимание, что в базе данных, типом поля для хранение значение констант является varchar(255). Но как известно значения наших констант бывают не только строковыми (обычный текст) но и булевыми (имеют значение true или false). Поэтому в методе setConstant() присутствует условный оператор switch, который поможет нам отловить строковое значение TRUE и FALSE и принудительно привести его (значение) к типу boolean.

Класс application.class.php

В этом классе, нам всего лишь нужно удалить вызов метода setConnect() класса sql.class.php. Вот новый код метода run() (файл называется application.class.php и лежит в папке /rs-mini/core/)

/*
 * главный метод. запуск системы
 *
 * @access  - public
 *
 */
 
public static function run()
{
    // поднимаем некоторые классы ядра
    // объект по работе с структурой сайта
    self::$map = new map();
    // объект прослойка между контроллерами и вьюшкой
    self::$dom = new dom();
    
    // получаем открываемую страницу
    if (!self::$map->getPage())
        self::notFound();
        
    // мероприятия по объеденению унаследованных контроллеров с конечной страницей
    self::unionRun();
    
    // запускаем контроллеры
    self::controllerRun();
}

Класс sql.class.php

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

Первым делом избавимся от строчки (файл sql.class.php который лежит в папке /rs-mini/core/)

use \conf\config AS config;

так как класс конфига нам тут теперь не нужен.

Ну и на по следок изменяем метод setConnect() (тот же файл в той же папке)

/* 
 * подключаемся к БД
 *  
 * @access - public
 *  
 */
 
public static function setConnect()
{
    // подключаемся к БД
    self::$resource = @mysqli_connect(
        DB_SERVER, // сервер
        DB_USER,   // юзер
        DB_PASS,   // пароль юзера
        DB_NAME    // база данных
    );
 
    // если подключение прошло с ошибкой
    if (!self::$resource)
        die('Ошибка ' . CMS . ' v' . VERSION . ': При подключение к базе данных произошла ошибка');
 
    // устанавливаем кодировку базы
    mysqli_set_charset(self::$resource, "utf8");
}

Заключение

Ничего сверхъестественного в данном материале нет, но если у Вас возникли какие либо вопросы, то пишите их в комментариях, попробую на них ответить.

Результат проделанной работы Вы как всегда можете скачать в конце статьи.

Всего Вам наилучшего, на сегодня у меня все!

Прикрепленные файлы

 

Возможно Вам будут интересны следующие заметки

Комментарии (0)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
К данной статье пока нет комментариев.