За последние 24 часа нас посетили 24544 программиста и 1800 роботов. Сейчас ищут 944 программиста ...

Роутинг в Php, обяснение

Тема в разделе "PHP для новичков", создана пользователем Sergey_php, 19 сен 2016.

  1. Sergey_php

    Sergey_php Новичок

    С нами с:
    16 сен 2016
    Сообщения:
    50
    Симпатии:
    2
    • Оформляй код, кнопка </> в редакторе.
    Не понятно что происходит,
    Зачем используем explode..., объясните код по шагам ,
    общий понимаю роутинг для чего но код не понятно .
    PHP:
    1. class Route
    2. {
    3.     static function start()
    4.     {
    5.      
    6.         $controller_name = 'Main';
    7.         $action_name = 'index';
    8.      
    9.         $routes = explode('/', $_SERVER['REQUEST_URI']);
    10.  
    11.      
    12.         if ( !empty($routes[1]) )
    13.         {
    14.             $controller_name = $routes[1];
    15.         }
    16.      
    17.      
    18.         if ( !empty($routes[2]) )
    19.         {
    20.             $action_name = $routes[2];
    21.         }
    22.  
    23.         $model_name = 'Model_'.$controller_name;
    24.         $controller_name = 'Controller_'.$controller_name;
    25.         $action_name = 'action_'.$action_name;
    26.  
    27.      
    28.  
    29.         $model_file = strtolower($model_name).'.php';
    30.         $model_path = "application/models/".$model_file;
    31.         if(file_exists($model_path))
    32.         {
    33.             include "application/models/".$model_file;
    34.         }
    35.  
    36.      
    37.         $controller_file = strtolower($controller_name).'.php';
    38.         $controller_path = "application/controllers/".$controller_file;
    39.         if(file_exists($controller_path))
    40.         {
    41.             include "application/controllers/".$controller_file;
    42.         }
    43.         else
    44.         {
    45.             /*
    46.             правильно было бы кинуть здесь исключение,
    47.          
    48.             */
    49.             Route::ErrorPage404();
    50.         }
    51.      
    52.      
    53.         $controller = new $controller_name;
    54.         $action = $action_name;
    55.      
    56.         if(method_exists($controller, $action))
    57.         {
    58.          
    59.             $controller->$action();
    60.         }
    61.         else
    62.         {
    63.      
    64.             Route::ErrorPage404();
    65.         }
    66.  
    67.     }
    68.  
    69.     function ErrorPage404()
    70.     {
    71.         $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
    72.         header('HTTP/1.1 404 Not Found');
    73.         header("Status: 404 Not Found");
    74.         header('Location:'.$host.'404');
    75.     }
    76. }
     
    #1 Sergey_php, 19 сен 2016
    Последнее редактирование модератором: 19 сен 2016
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ровно для того, как описано в документации - https://php.ru/manual/function.explode.html - чтобы разбить строку на части по слэшу, в данном случае.
    Первая часть считается именем контроллера и модели, вторая - именем метода контроллера. Потом соответствующие файлы подключаются с помощью include(), создается объект контроллера
    и вызывается метод
    в $action - имя метода
    Если нет файла или нет метода, вызывается ошибка 404.
     
    Sergey_php нравится это.
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.857
    Симпатии:
    656
    @Sergey_php, последний метод – полный птец – где вы ЭТО взяли?

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

    Sergey_php Новичок

    С нами с:
    16 сен 2016
    Сообщения:
    50
    Симпатии:
    2

    А там $routes[1] и $routes[2] что делают.
     
  5. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Sergey_php если адрес site.ru/a/b, то массив $routes примет такой вид
    Код (Text):
    1. [
    2. 0 => 'site.ru',
    3. 1 => 'a',
    4. 2 => 'b'
    5. ]
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    @Sergey_php, а писали, что знаете php и ооп. explode разбивает строку на части. В $_SERVER["REQEUST_URI"] что-то вроде "/controller/action", после explode мы получаем массив
    PHP:
    1. [
    2. 0 => '', 1 => 'controller',2 => 'action'
    3. ]
    @[vs], там нету site.ru, в $_SERVER["REQEUST_URI"].
     
    [vs] нравится это.
  7. Sergey_php

    Sergey_php Новичок

    С нами с:
    16 сен 2016
    Сообщения:
    50
    Симпатии:
    2



    Да знаю что explode делает просто не понял зачем это там, $_SERVER["REQEUST_URI"] здесь request_url какая ссылка должен быть ?
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  9. Sergey_php

    Sergey_php Новичок

    С нами с:
    16 сен 2016
    Сообщения:
    50
    Симпатии:
    2
    $_SERVER["REQEUST_URI"] какой url должен быть ?
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Sergey_php нравится это.
  11. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Sergey_php в $_SERVER["REQEUST_URI"] автоматически будет URL когда попытаешься открыть какую-либо страницу, при этом должны существовать контроллер с соответствующим именем и методом.
    Чтобы роутинг работал, все запросы к домену должны перенаправляться на index.php, это можно сделать с помощью .htaccess.
     
    Sergey_php нравится это.
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    "Знаю php" подразумевает, что назначение переменной $_SERVER известно, где посмотреть, какие в этом массиве элементы и для чего нужны - тоже известно. $_SERVER["REQUEST_URI"] - самый используемый элемент этого суперглобального массива
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты зачем это написал? Неправда твоя.