ЧПУ на PHP

Здесь я представлю свой файлик который позволит вам использовать ЧПУ на PHP, без перекладывания ответственности на БД.

Файл позволяет:

  1. Работать со ссылками прямо из него, всё просто и понятно, результатом работы является массив.
  2. Контроль уровня доступа к некоторым URI.
  3. Быстрое изменение самого URI для перехода.

Кратко выражаясь, это очень похоже на файл urls.py из Django, только на PHP.

А вот и сам код:

 class urls
    {
        /* Описание переменых:
            address Адрес по которому пользователь оброщается
                * начало строки
                & конец строки

            aces_level Уровень доступа, к даному url

            file Файл котырый необходимо предоставить

            a_id_html элемент  id в вёрстки html куда будет выведена сыллка

            ({?vars?}) - возврощаемое значения без пробелов
         */

        private $urls = array(
            array("address"=>"*&", "aces_level"=>"1", "file"=>"pages/main.php", "a_id_html"=>"main"), //Главна страница
            array("address"=>"*login&", "aces_level"=>"0", "file"=>"pages/login.php", "a_id_html"=>"main"), //Логин
            array("address"=>"*logout&", "aces_level"=>"2", "file"=>"all/logout.php", "a_id_html"=>"main"), //Деавторизация
            array("address"=>"*signup&", "aces_level"=>"0", "file"=>"pages/checkIn.php", "a_id_html"=>"main"), //Регистрация
            array("address"=>"*admin&", "aces_level"=>"5", "file"=>"admin_panel/main.php", "a_id_html"=>"main"), //Панель админитратора
            );

        private $aces_level = 0; //Уровень доступа
        private $auth = 0; //Показывает авторизован, ли пользователь

        private $dont_autherezet_user = 1; //Уровень доступа для не авторизованых пользователей

        //Элементы для авторизации
        private $user_auth_session = ''; //Названия элемента в массиве _SESSION
        private $user_auth_cookie = ''; //Название элемента в массиве _COOKIE

        private $user_url_decomposition; //URL пользователяв необходимом виде

        private $page_404_error = "pages/error_page.php";

        private function decomposition_url($url_for_decomposition){ //первращение url в массив с данными
            $request = str_split($url_for_decomposition); $cell_number = -1;
            $words = array();
            for ($char = 0; $char < count($request); $char++) {
                // оброботка спец символов
                if ($char == 0 and $request[$char] == '*'){
                    continue;
                }
                if ($request[$char] == '&'){
                    break;
                }

                if ($request[$char] == '/') {
                    $cell_number += 1;
                    continue;
                }

                if ($cell_number < 0) {
                    //При возникновении ошибки, если не выполнился, ни один блок выше
                    $cell_number += 1;
                }
                $words[$cell_number] = $request[$char]; //сложение строк
            }
            return $words;
        }

        //проверка на наличие переменых во внутренних URL ($urls), где $url это строка из $urls
        private function checking_for_variables_in_internal_URLs($url){
            $url = $this->decomposition_url($url); //Получаем, массив из $url

            //Производим, поиск номера элемента массива с переменой.
            $array_with_numbers = array();
            for ($char_number=0; $char_number<count($url); $char_number++){
                $str_array = str_split($url[$char_number]);
                for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
                    //начинаем проверку строки
                    if ($str_array[$char_number_in_for] == '('){
                        $num = $char_number_in_for+1;
                        if ($str_array[$num] == '{'){
                            $num = $char_number_in_for+2;
                            if ($str_array[$num] == '?'){
                                // Переменая найдена сохраняем номер элемента
                                $array_with_numbers[] = $char_number;
                                break; //При нахождении выходим в основной цикл
                            }
                        }
                    }
                    //Иначе проходим цикл без вопросов
                }
            }
            //Производим поиск переменой в пользовательском REQUEST_URI

            if (!isset($array_with_numbers[0])){
                return;
            }

            $variables_array = array();

            for ($char_numbers=0; $char_numbers<count($array_with_numbers); $char_numbers++){
                $all = $this->user_url_decomposition[$variables_array[$char_numbers]];
            }
            return $variables_array; //Возврощаем, массив вида "название переменой"=>"значение"
        }

        function __construct($aces_level_front, $auth=0)
        {
            if ($auth != 0 ){
                $this->auth = $auth;
            }
            $this->user_url_decomposition = $this->decomposition_url($_SERVER['REQUEST_URI']);
            $this->aces_level = $aces_level_front; //Присваем уровень доступа для даного пользователя
        }

        public function url()
        {
            /* Возврощает массив с данными, подходящими по запросу, иначе ничего не возврощает. */

            //Цикл возврощает максимально подходящий элемент массива $urls
            for ($element_number=0; $element_number<count($this->urls); $element_number++) { //Обробатываем все елементы массива urls
                //Начинаем обробатывать остальные элементы массив
                //Производим проверку уровня досутпа
                if ($this->aces_level >= $this->urls[$element_number]['aces_level']) { //Если пользователь имеет права доступа
                    if ($this->urls[$element_number]['aces_level'] == 0 and $this->aces_level != 0) { // Проверяем что пользователь не авторизован
                        continue; //Если авторизован, переходим к следущему URL
                    }
                } elseif ($this->urls[$element_number]['aces_level'] != $this->dont_autherezet_user and $this->aces_level != 0) { //Если URL доступен для не авторизованых пользователей, то пропускаем пользователя
                    continue;                                                //Иначе переходим к следущему URL
                }                                                          //Также пользователь будет выходить отсюда, если не имет прав доступа

                if ($this->urls[$element_number]['aces_level'] > $this->dont_autherezet_user and $this->aces_level == 0){
                    //Если уровень доступа к URI больше чем уровень доступа не авторизованого пользователя то
                    continue;
                }

                //Начинаем сравнивать url
                $url = $this->decomposition_url($this->urls[$element_number]['address']); //Создаём массив из address

                //Првоеряем все совпадение URL до возможных

                $changing_similarities = 0; //Переменая сходства
                for ($variable_recognize_elements_array=0; $variable_recognize_elements_array<count($this->user_url_decomposition); $variable_recognize_elements_array++) { //сравниваемэлементы массивов
                    if ($this->user_url_decomposition[$variable_recognize_elements_array] == $url[$variable_recognize_elements_array]){
                        $changing_similarities++; //Если URL соподает, то продолжаем поиск
                    } else { // Иначе, проверяем не является ли даный элемент переменной
                        $str_array = str_split($url[$variable_recognize_elements_array]);

                        for ($char_number_in_for=0; $char_number_in_for<count($str_array); $char_number_in_for++){
                            //начинаем проверку строки
                            if ($str_array[$char_number_in_for] == '('){
                                $num = $char_number_in_for+1;
                                if ($str_array[$num] == '{'){
                                    $num = $char_number_in_for+2;
                                    if ($str_array[$num] == '?'){
                                        // Переменая найдена сохраняем номер элемента
                                        $changing_similarities++;
                                        break; //При нахождении выходим в основной цикл
                                    }
                                }
                            }
                            //Иначе проходим цикл без вопросов
                        }
                        if ($variable_recognize_elements_array+1 != $changing_similarities){ //Если не совпадений, то выходим из цикла
                            break;
                        }
                    }
                }

                if(count($this->user_url_decomposition) == $changing_similarities){ // Проверяем совподают ли url, это больше предостережение
                    //Возврощаем необходимый файл
                    $variables_array = $this->checking_for_variables_in_internal_URLs(($this->urls[$element_number]['address']));
                    return array('file'=>$this->urls[$element_number]['file'], 'vars'=>$variables_array);
                }
            }
            return array('file'=>$this->page_404_error); //Если не было найдено url, выводим ошибку
        }

        public function ajax_href(){
            /* Возврощает ссылки с id блоков a, на страницу в формате JSON*/
            
        }

        function __destruct()
        {
            $this->aces_level = 0; //Устанавливаем в изначальное положение
        }
    }

Надеюсь я удалил всё ненужное, но если найдёте что-нибудь, то обязательно сообщите.
Теги:
PHP

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.