За последние 24 часа нас посетили 22600 программистов и 1016 роботов. Сейчас ищут 718 программистов ...

Router, Встал в тупик

Тема в разделе "Сделайте за меня", создана пользователем Юра Шелгунов, 15 июн 2018.

  1. Юра Шелгунов

    Юра Шелгунов Новичок

    С нами с:
    26 авг 2016
    Сообщения:
    14
    Симпатии:
    0
    Всем привет, пишу роутер и встал в тупик, то ли мысль не идет или я не то делаю.

    Описание в коде

    Kод :

    $url - Массив URL запроса ( Пример: '0' => 'blog', '1' = 'post')

    all_url - Полный путь URL запроса ( Пример : /blog/post )

    Из функций ways долно вернуться массив :
    Код (Text):
    1. 'controller' => '',
    2. 'action' => '',
    3. 'key' => [ ]
    PHP:
    1. private function ways($url)
    2.     {
    3.         // Получаем массив со списоком всех роутеров
    4.         $ways = include ROOT.'/core/route/ways.php';
    5.  
    6.         if(empty($url[0])) {
    7.             $action = '/';
    8.         } else {
    9.             $action = $this->all_url;
    10.         }
    11.         // Если находим точное совпадение, отправляем массив
    12.         if(array_key_exists($action, $ways)) {
    13.             return $ways[$action];
    14.         } else {    
    15.        
    16. foreach ($ways as $key => $value) {
    17.     if(preg_match('{id}', $key)) {
    18.       // Тут мысль встала
    19.  
    20. Нужно проверить запрос на совпадения ( Пример: запрос URL /category/test/test1  надо сравнить его с этим : category/{id}/{id} ) если сходиться то вернуть return массив
    21.  
    22.     }
    23. }
    24.  
    25.     }
    Файл ways.php
    PHP:
    1. <?php
    2.  
    3. return [
    4.     // Главная
    5.     '/' => [
    6.         'controller' => 'home',
    7.         'action' => 'index'
    8.     ],
    9.     // Добавить матерьял
    10.     'add' => [
    11.         'controller' => 'product',
    12.         'action' => 'add'
    13.     ],
    14.    
    15.  
    16.     /*
    17.     * Категорий
    18.     */
    19.  
    20.     // Все категорий
    21.     'category' => [
    22.         'controller' => 'category',
    23.         'action' => 'all'
    24.     ],
    25.     // Получаем матерьял категорий
    26.     'category/{id}/{id}' => [
    27.         'controller' => 'category',
    28.         'action' => 'get',
    29.         'key' => [
    30.             'category' => $url[1],
    31.             'subcategory' => $url[2]
    32.         ]
    33.     ],
    34.  
    35. ];
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    full_url?

    routes?
    это очень скользкий путь

    зачем тебе свой роутер?
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    к тому же, с некорректным регулярным выражением
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    роутеры с регулярками всегда утыкаются в экспоненциальный рост нагрузки при росте числа путей
     
  5. Юра Шелгунов

    Юра Шелгунов Новичок

    С нами с:
    26 авг 2016
    Сообщения:
    14
    Симпатии:
    0
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Нужно чтобы код и данные гармонировали друг с другом, а не выдумывать фиг знает какой формат данных, чтобы потом чесать репу по поводу его обработки.
    --- Добавлено ---
    Нафиг вы в метод передаете компоненты пути, когда у вас ключами у роутов служат полноценные, в том числе и многокомпонентные, маски?
     
  7. Liberty@

    Liberty@ Гость

    С нами с:
    17 июн 2018
    Сообщения:
    2
    Симпатии:
    0
    Простейший пример роутера:
    PHP:
    1. <?php
    2. //ROUTER class
    3.  
    4. class router {
    5.  
    6.     public function getURI() {
    7.         if (!empty ($_SERVER['REQUEST_URI'])) {
    8.             return trim ($_SERVER['REQUEST_URI'],'/');
    9.         }  //эта функция возвращает запрос из адресной строки без пробелов
    10.     }
    11.  
    12.     public function checkRequest($request_controller,$request_action) {
    13.         $file = 'controllers/'.$request_controller.'.php'; //какой контроллер и где будем искать
    14.  
    15.     if (!file_exists($file)) { //если не нашли класс контроллера
    16.             $request_controller = 'undefine';  //делаем контроллер страницы 404
    17.             $request_action = 'no_controller';   //метод "не нашли контроллер"
    18.             $request_array = array($request_controller,$request_action);
    19.             return $request_array;  //вернем массив с контроллером undefine.php и методом "нет контроллера" undefine.php должен быть и //показывать соответствующее сообщение
    20.         }
    21.      
    22.         require $file; //если нашли подключим класс контроллера (лучше это делать _autoloadom)
    23.         $available_methods = get_class_methods($request_controller); //посмотрим какие методы есть в нашем классе контроллера
    24.      
    25.         if (!in_array($request_action, $available_methods)) { //если не существует запрошенный метод
    26.             $request_controller = 'undefine'; //опять 404
    27.             $request_action = 'no_action';       //только уже с методом "не нашли метода"
    28.             $request_array = array($request_controller,$request_action);
    29.             return $request_array;      //вернем массив    
    30.         }
    31.        
    32.             $request_array = array($request_controller,$request_action); //если контроллер и метод существуют просто вернем их в массиве
    33.             return $request_array;
    34. }
    35.      
    36.     public function run(){
    37.      
    38.         $uri = $this -> getURI();  //получим запрос из адресной строки
    39.             if (empty($uri)) { $uri = 'site/index';}     //если пустой будем открывать страницу по умолчанию
    40.             if (!preg_match('~^[0-9a-z/_]{1,55}$~',$uri)) {$uri='site/index';}   //если в запросе есть символы кроме a-z, A-Z цифры 0-9 или / и _ или он //длиннее 55 символов тоже откроем страницу по умолчанию (руководствуемся правилом "Белого списка"
    41.      
    42.             $uri = explode('/',$uri);  //превратим строку $uri в массив разбив на значения по символу /
    43.             $request_controller = array_shift($uri);  //положим в переменную $request_controller первый элемент массива $uri - это будет наш //контроллер
    44.             $request_action = array_shift($uri);      // второй элемент массива $uri положим в переменную $request_action - это будет метод который //будем вызывать
    45.        
    46.        $request_array = $this -> checkRequest($request_controller, $request_action); //проверим есть ли у нас такой контроллер и метод в нем. //Функция checkRequest вернет массив в котором нулевым элементом будет валидный контроллер который у нас точно есть, а первым //элементом будет метод контроллера который у нас тоже есть.
    47.    
    48.        $c_request_controller = $request_array[0]; // вытащим из массива контроллер
    49.        $c_request_action = $request_array[1]; //и метод
    50.            
    51.        $controller = new $c_request_controller; //создадим экземпляр класса контроллера
    52.        $controller -> $c_request_action($request_controller,$request_action,$uri); //и вызовем метод передав ему в качестве аргументов //контроллер, метод и остаток от $uri если он есть. Т.е. например запрос www.site.ru/shownews/1 вызовет контроллер site метод shownews и //передаст 1 в качестве аргумента.
    53.  
    54.     } //end function run
    55.  
    56.  
    57. }
    58.  
    59.  
    60. ?>
     
    #7 Liberty@, 17 июн 2018
    Последнее редактирование модератором: 18 июн 2018
  8. Liberty@

    Liberty@ Гость

    С нами с:
    17 июн 2018
    Сообщения:
    2
    Симпатии:
    0
    Плюс данной реализации в том что не надо писать все возможные пути в массив в файле "ways.php" и помнить о них.
    Есть в папке controllers запрошенный контроллер и в нем нужный метод - он будет работать. Нет - будет 404