За последние 24 часа нас посетили 17783 программиста и 1714 роботов. Сейчас ищут 1696 программистов ...

ЧПУ, mod_rewrite, MVC

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

  1. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а. ну теперь-то у ты ваще прям ответил на мой вопрос. ответил так ответил. ух как ответил. мдя...
     
  2. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    В чем я ошибаюсь, сэнсэй?=) Объясни новичку, пожалуйста. Ну вот, я обращаюсь к веб-серверу, т.е. делаю запрос. Веб-сервер принимает его и обрабатывает, затем отправляет результат обработки запроса мне, не?=)Хотя вот так лучше будет: я отправляю запрос->он обрабатывает его->выполняет код->отправляет мне ответ
     
  3. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я у тебя спрашиваю логику прохождения запроса от веб-сервера к твоему движку. а ты мне про какую-то там базу данных рассказываешь. "какая разница между помидором и трактором?" спрашиваю я. "помидор он красный, а у трактора дверь вот так открывается" - отвечаешь мне ты.
    ты прочитал про относительные пути?
    ты изучил отладочный лог рерайтера?
    ты вообще хотя бы поверхностно понимаешь как апач передает управление пхп-машине для обработки запроса?
    не надо мне про записи в базе данных рассказывать. мы сейчас отлаживаем этап разрешения запроса. тот который у тебя постоянно статусом 404 заканчивается потому что ты мартышка с гранатой.
     
  4. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ты меня сам спросил про веб-сервер, я тебе ответил. Ты то про одно, то про другое. "мартышка с гранатой" - добавлю в список. Читал и про абсолютный и про относительные пути. Я отправляю GET-запрос на получение id.
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты видишь только одну сторону медали?
     
  6. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Ты это о чем?
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    о том. я тебя прошу рассказать мне всю логику прохождения запроса от принятия его веб-сервером до выбора пхп-машиной целевого скрипта. разрешение апачем, применение алиасов, рерайт. все интимные подробности включая пути. в том числе пути в файловой системе. можно своими словами. а ты мне что отвечаешь?
    тебе не кажется что я не это ожидаю от тебя услышать? вот эта твоя теория она ведь тебе нихерашечки не помогает понять как оно должно работать и как работает на самом деле и почему не работает как ты ожидаешь.
     
  8. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    в модели - test.ru/core/models/models_index.php я обращаюсь к нужной мне таблице в БД, в моем случае -это pages. Записываю все это в массив. Затем в test.ru/core/controllers/controller_index я передаю данный массив в представление - test.ru/core/views/template.php. Там пробегаюсь форичем для получения алиасов из моего массива- $menu['url'], а также для получения id - $menu['id']. Ссылки выглядят так:
    Код (PHP):
    1. [url="<?=$menu['url'].'?id='.$menu['id'].';?>"]text[/url]
    А вот так выглядит роутер(test.ru/core/lib/route.php):
    Код (PHP):
    1. class Route
    2. {
    3.     static function start()
    4.     {
    5.         // контроллер и действие по умолчанию
    6.         $controller_name = 'index';
    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.         // добавляем префиксы
    24.         $model_name = 'Model_'.$controller_name;
    25.         $controller_name = 'Controller_'.$controller_name;
    26.         $action_name = 'action_'.$action_name;
    27.  
    28.         
    29.         // Для пользовательских шаблонов. Подцепляем файл с классом модели
    30.  
    31.         $model_file = strtolower($model_name).'.php';
    32.         $model_path = "core/models/".$model_file;
    33.         if(file_exists($model_path))
    34.         {
    35.             include "core/models/".$model_file;
    36.         }
    37.  
    38.         // подцепляем файл с классом контроллера
    39.         $controller_file = strtolower($controller_name).'.php';
    40.         $controller_path = "core/controllers/".$controller_file;
    41.         if(file_exists($controller_path))
    42.         {
    43.             include "core/controllers/".$controller_file;
    44.         }
    45.         else
    46.         {
    47.             Route::ErrorPage404();
    48.         }
    49.         
    50.         // создаем контроллер
    51.         $controller = new $controller_name;
    52.         $action = $action_name;
    53.         
    54.         if(method_exists($controller, $action))
    55.         {
    56.             // вызываем действие контроллера
    57.             $controller->$action();
    58.         }
    59.         else
    60.         {
    61.             Route::ErrorPage404();
    62.         }
    63.     
    64.     }
    65.     
    66.     public static function ErrorPage404()
    67.     {
    68.         $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
    69.         header('HTTP/1.1 404 Not Found');
    70.         header("Status: 404 Not Found");
    71.         header('Location:'.$host.'404');
    72.     }
    73. } 
    Так выглядит файл .htaccess:
    Код (PHP):
    1. AddDefaultCharset utf-8
    2. RewriteEngine On
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteCond %{REQUEST_FILENAME} !-d
    5. RewriteRule .* index.php [L] 
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты все еще неправильно отвечаешь на вопрос. зачем мне знать про модели и контроллеры? может ты мне еще про высадку на луну расскажешь что-нибудь интересное?
     
  10. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    я уже не знаю, что еще тебе описывать нужно. Лог рерайтера? код файла запуска MVC? Что еще?
     
  11. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    я честно говоря перестаю понимать какая у тебя проблема. апач запрос принял, рерайтер запрос переписал, пхп-машина точку входа - индекс.пхп - выполнила, роутер реквест-ури разрбрал, модели-контроллеры-действия-виды ты объявил. что не так-то?
     
  12. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Он написал что достаёт из базы какие то алиасы. А потом из них генерит ссылки.
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    о, переводчик нашелся. а проблема какая у него?
     
  14. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Индекс.пхп в корне есть. Рерайтер будем считать настроен.
    Тут путаница пошла из за того, что у него роутер перекидыает на 404, если не удалось загрузить модель/контроллер или нет метода контроллера. Поэтому вы можете разговаривать о разных 404.
    Я бы посмотрел на это
    в отрендеренном виде
     
  15. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Вот именно дело в том, что он id напрочь не принимает. Работает только с алиасом. Т.е. вот так работает только:
    Код (PHP):
    1. [url="<?=$menu['url'].';?>"]text[/url]
    Где $menu['url']- это алиас из БД - index(и другие), получается, что с ним ссылка выглядит вот так:
    Код (PHP):
    1. [url="index"]text[/url]
     
  16. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а относительный урл этого ресурса какой должен быть?
     
  17. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    views/index.php
     
  18. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нет, не то что у тебя там в кишках твоего движка а то что в браузере пользователь увидит.
     
  19. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    test.ru/index
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    хорошо. попробуй добавить лидирующий слэш.
     
  21. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    Это типа вот так(?):
    /index
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    именно
     
  23. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    ничего не изменилось=)
     
  24. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что ты ожидаешь-то? вот есть у тебя урл. по этому урлу вебсервер рерайтится на пхп-машину. в пхп-машине у тебя типа роутер который делает модули-контроллеры-бла-бла-бла. что не так-то до сих пор? где ты тупишь?
     
  25. Qumo

    Qumo Активный пользователь

    С нами с:
    6 июн 2013
    Сообщения:
    160
    Симпатии:
    0
    я ожидаю, что он начнет id принимать, вместо 404 ошибки=)