За последние 24 часа нас посетили 11160 программистов и 815 роботов. Сейчас ищут 395 программистов ...

Помогите настроить .htaccess

Тема в разделе "PHP для новичков", создана пользователем AnteFil, 3 май 2022.

  1. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Настраиваю ссылки хочу привести к такому виду
    site/язык/get/
    сейчас прописано так

    Код (Text):
    1. RewriteRule ^rus/(.*)/$ /search.php?lang=rus&q=$1
    Проблема в том что для каждого языка нужно создавать по две записи одна та что выше и вторая если get параметра нет
    Код (Text):
    1. RewriteRule ^rus/$ /search.php?lang=rus
    для 20 языков уже создаётся 40 записей а если добавить ещё один get то уже 60
    Можно ли как то это упростить???

    Второй вопрос
    На странице есть форма. При отправке данных с формы получаю ссылку вида
    /rus/?q=апапап
    а нужно
    /rus/апапапапа/
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.561
    Симпатии:
    1.284
    Адрес:
    Лень
    изучи единую точку, роутинг. Станет легче и понятнее. Сейчас кашу мутишь в каше - велосипед WTF
     
  3. antoniii

    antoniii Новичок

    С нами с:
    16 мар 2022
    Сообщения:
    315
    Симпатии:
    62
    Зачем создавать две записи если можно в search.php проверять существование параметра и его значение. По второму вопросу: можно вообще поменять метод в форме и запрос не будет виден.
     
  4. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Ок начал разбираться
    PHP:
    1. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $segments = explode('/', trim($uri, '/'));
    3. //Получаем доступные языки из папки lang
    4. $get_lang_mas = scandir('lang/');
    5. foreach ($get_lang_mas as $get_lang) {
    6.     preg_match('/\w\w\w/', $get_lang, $leng);
    7.     if (!empty($leng)) {
    8.         $leng_mas[] = $leng;
    9.     }
    10. }
    11. //сравниваем доступные языки с запрашиваемыми
    12. foreach ($leng_mas as $odin) {
    13. if($segments[0]==$odin[0])
    14. echo 'язык определили';
    15. }
    после чего у меня будет первая часть ссылки правильно думаю ?
    site/rus/
    добавил вот так
    PHP:
    1. foreach ($leng_mas as $odin) {
    2. if($segments[0]==$odin[0])
    3. $ssika[] = $segments[0];
    4. }
    5. if (!empty($segments[1])){
    6. $ssika[] = $segments[1];  
    7. }
    8. header("Location: https://dottorrent.ru/$ssika[0]/$ssika[1]/");
    Всё заканчивается бесконечным редиректом
     
    #4 AnteFil, 3 май 2022
    Последнее редактирование: 3 май 2022
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.605
    Симпатии:
    600
    Какой ссылки? В смысле входящего адреса? Когда парсят путь из входящего адреса explode'ом, то первая часть – это, естественно, rus (если site – это имя хоста). У вашего парсинга есть огрехи. Непробиваемый вариант показан в этой статье: Как сделать единую точку входа с ЧПУ?

    И нафига цикл для проверки попадания в созданный белый список? Здесь даже ф-ция поиска в массиве – это логическая ошибка. Сделайте rus и т.п. ключами массива – можно будет использовать бинарный поиск, т.е. просто проверять наличие этого ключа.
    --- Добавлено ---
    Нафига Location? Вы про это вообще ничего не писали. Или думаете, что Location нужен для реализации роутинга? :D
    --- Добавлено ---
    Фишку из кода моей статьи с добавлением пустого второго компонента пути можно использовать и вам. Ее смысл в том, что потом не нужно проверять наличие этого параметра, как имени переменной. После этого можно искать просто по значению. Т.е. «тупо» искать и не найти пустой ключ. Или искать и найти :)
     
    #5 miketomlin, 4 май 2022
    Последнее редактирование: 4 май 2022
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.605
    Симпатии:
    600
    Если q – это типа параметр из формы, то меняем метод на POST и в POST-обработчике делаем редирект методом GET (можно и Get-Redirect-Get, но это реально тупо). Иначе просто action="/rus/апапапапа/" ;) Хотя все равно должен быть Post-Redirect-Get.
     
    #6 miketomlin, 4 май 2022
    Последнее редактирование: 4 май 2022
  7. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Я чёт понять не могу.........Получил я два нужных мне параметра /язык/запрос/ что мне с ними дальше делать? Как отдать браузеру ?
    Например был некорректный запрос site.ru/язык/запрос/fgfdgdg/gdfgdfgdg/ я хочу взять нужные 2 параметра и обработать затем сказать браузеру что site.ru/язык/запрос/fgfdgdg/gdfgdfgdg/ не существует и отдать браузеру site.ru/язык/запрос/
    Вот сейчас у меня идёт бесконечный редирект
     
  8. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Вы пытаетесь создать то, что сами не знаете как должно работать. Возьмите любую CMS и вникайте как она устроена. В результате вы должны понимать буквально весь путь от htaccess и index.php до вызовов методов контроллера. Разобрались? Время разочарований: берите другую CMS и снова разбираете, сравнивая с предыдущей.
    Вот тогда у вас сложится картинка и советы коллег станут приобретать смысл.
     
  9. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    дак я и пытаюсь разобраться. Вот так придумал
    PHP:
    1. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $segments = explode('/', trim($uri, '/'));
    3. //Если пришло больше параметров чем нужно значит ошибка перенаправим на адекватную страницу
    4. if(!empty($segments[2])){
    5.     header("Location: localhost/$segments[0]/$segments[1]/", true, 301);
    6.     exit();
    7. }
    8. //Получаем доступные языки из папки lang
    9. $get_lang_mas = scandir('lang/');
    10. foreach ($get_lang_mas as $get_lang) {
    11.     preg_match('/\w\w\w/', $get_lang, $leng);
    12. //Сравниваем доступные языки с запрашиваемым если совпадает выходим из перебора
    13.     if ($segments[0]==$leng[0]) {
    14.         break;
    15.     } else {
    16. //Запрашиваемый язык не нашли возвращаем русский по умолчанию
    17.         $leng[0] = 'rus';
    18.     }
    19. }
    20. echo $leng[0];
     
  10. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Вот так ещё дописал
    PHP:
    1. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $segments = explode('/', trim($uri, '/.'));
    3. //Если пришло больше параметров чем нужно значит ошибка
    4. if(!empty($segments[2])){  
    5. header("Location: localhost/$segments[0]/$segments[1]/", true, 301);
    6. exit();
    7. }
    8. //Нет запроса по этому придумаем его
    9. if(empty($segments[1])){  
    10. $input = array("Человек", "Марс", "Батистута", "Барабан", "Tank", "Баргузин", "Матрица", "Павел Мурашко");
    11. $rand_keys = array_rand($input, 2);
    12. header('Location: localhost/'.$segments[0].'/'.$input[$rand_keys[0]].'/', true, 301);
    13. exit();
    14. }
    15. //Нет языка редиректим на русский по умолчанию
    16. if(empty($segments[0])){  
    17. header('Location: localhost/rus/', true, 301);
    18. exit();
    19. }
    20. //Получаем доступные языки из папки lang
    21. $get_lang_mas = scandir('lang/');
    22. foreach ($get_lang_mas as $get_lang) {
    23.     preg_match('/\w\w\w/', $get_lang, $leng);
    24. //Сравниваем доступные языки с запрашиваемым если совпадает выходим из перебора
    25.     if ($segments[0]==$leng[0]) {
    26.         break;
    27.     } else {
    28. //Запрашиваемый язык не нашли верём русский по умолчанию
    29.         $leng[0] = 'rus';
    30.     }
    31. }
    32. echo $leng[0];
     
  11. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    ещё немного переделал
    PHP:
    1. //Если нет запроса то придумывать его не будем а просто покажем стартовую страницу
    2. if(empty($segments[1])){
    3. include('main.php');
    4. exit();
    5. }
    таким образом получается структура сайта
    site.ru/rus/
    site.ru/rus/проверка/
     
    #11 AnteFil, 4 май 2022
    Последнее редактирование: 4 май 2022
  12. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Ещё раз переписал )))
    PHP:
    1. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $segments = explode('/', trim($uri, '/.'));
    3. //Если пришло больше параметров чем нужно значит ошибка
    4. if(!empty($segments[2])){  
    5. header("Location: localhost/$segments[0]/$segments[1]/", true, 301);
    6. exit();
    7. }
    8. //Нет запроса грузим main.php
    9. if(empty($segments[1])){  
    10. include('main.php');
    11. exit();
    12. }
    13. //Нет языка редиректим на русский по умолчанию
    14. if(empty($segments[0])){  
    15. header('Location: localhost/rus/', true, 301);
    16. exit();
    17. }
    18. //если мы дошли сюда то значит всё в порядке и загрузим страницу search
    19. $_SESSION['lang'] = $segments[0];
    20. $_SESSION['get'] = $segments[1];
    21. include('search.php');
     
  13. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.605
    Симпатии:
    600
    Вы это у нас спрашиваете? :)

    Попробуйте echo :) Можно и дальше пойти, т.к. сами параметры из адреса обычно не нужно выводить (по ним др. данные выбирают):
    PHP:
    1. <h1><?= $page['name'] ?></h1>
    2. <?= $page['content'] ?>
    Код (Text):
    1. INSERT INTO `site_categories` (`id`, `name`, `bits`, `module`) VALUES
    2. ('rus', 'Язык: русский', 19, 'page');
    3.  
    4. CREATE TABLE `site_rus` (
    5.   `id` varchar(26) NOT NULL,
    6.   `name` tinytext NOT NULL,
    7.   `content` text NOT NULL,
    8.   PRIMARY KEY (`id`)
    9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    10.  
    11. INSERT INTO `site_rus` (`id`, `name`, `content`) VALUES
    12. ('', 'Главная', '<p>Главная</p>'),
    13. ('get', 'Внутряк', '<p>Внутряк</p>');
    В итоге:
    g09.ru/rus
    g09.ru/rus/get
    --- Добавлено ---
    Лучше отдать 404-ую без редиректа. Корректировку редиректом обычно делают для опечаток в адресе или для ранее существовавших страниц, траф на которые уместно направить на что-то другое.
    --- Добавлено ---
    Но если сильно хоЦА, пишите соотв. логику.
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.605
    Симпатии:
    600
    Например, я могу перевести используемый фронт-контроллер в режим «ручного анализа второго параметра» и добавить такой контроллер:
    PHP:
    1. if (count($pa = explode('/', $p1, 2)) < 2)
    2. {
    3.   $page = findOrFail(table($p0), $pa[0]);
    4. }
    5. else
    6. {
    7.   redirect('/'.$p0.'/'.$pa[0]);
    8. }
    У меня $p0 == 'rus' && $p1 == 'запрос' (или 'запрос/fgfdgdg/gdfgdfgdg'). В реале вместо $p0 лучше использовать спец. переменную, значение которой выбрано из БД, а не получено из адреса.
     
    #14 miketomlin, 4 май 2022
    Последнее редактирование: 4 май 2022
  15. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Я вот про это.....
    Это похоже на единую точку входа или я всё же что ещё не совсем понимаю
    Понятно что с переменными можно дальше уже работать запросы в базу или ещё чего
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.561
    Симпатии:
    1.284
    Адрес:
    Лень
    @AnteFil, Ты OpenServer используешь ?
     
  17. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Помогите распознать слеш
    PHP:
    1. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    2. $segments = explode('/', trim($uri, '/.'));
    3. //Если пришло больше параметров чем нужно значит ошибка
    4. if(!empty($segments[0])){
    5. header("Location: /rus/", true, 301);
    6. } else {
    7. include('main.php');
    8. }
    При таком подходе я не могу проверить есть ли слеш на конце так как создавая массив слешы удаляются и сайт доступен как по site/rus так и site/rus/
     
  18. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Парни, парни, парни ещё раз переписал у кого будут замечания напишите пожалуйста
    PHP:
    1. // Проверка полного УРЛ
    2. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    3. // Удаляем всё ненужное из УРЛ
    4. $clean_uri = str_replace(array('//', '\\', '\'', '"', ' '), '', $uri);
    5. // Проверим чем заканчивается УРЛ слеш там или нет
    6. $slesh = substr($clean_uri, -1);
    7. if($slesh!=='/'){
    8.     header('Location: '.$_SERVER['REQUEST_URI'].'/');// На конце не слеш редиректим со слешем
    9. }
    10. //Переходим к обработке принимаемых данных создадим массив
    11. // Обрежем километровые запросы они нам не к чему
    12. $short_url = substr($clean_uri, 0, 200);
    13. $segments = explode('/', trim($short_url, '/'));// создаём массив из УРЛ строки
    14. //Проверяем на наличие языка если его нет редиректим на язык по умолчанию
    15. if(empty($segments[0])){
    16. header('Location: '.$_SERVER['REQUEST_URI'].'/rus/');
    17. } else {
    18. //Язык есть и УРЛ меня устраивает поэтому с ним больше делать нечего и покажем то за чем пришли страницу
    19. include('main.php');    
    20. }
    21.  
    22.  
     
  19. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.605
    Симпатии:
    600
    Все плохо :) Начиная с первой строчки. Расписывать уже в лом, т.к. обратной реакции ноль.
    --- Добавлено ---
    Вместо того чтобы думать об «Обрежем километровые запросы они нам не к чему», лучше бы вспомнили, что в REQUEST_URI может быть не только путь, поэтому лепить к этому трэйлинг слеш – затея так себе ;) Про доп. логику, не относящуюся к делу, когда уже намечен редирект, промолчу :)
    --- Добавлено ---
    P.S. Фронт может обрабатывать запросы как бы к файлам, поэтому бездумно лепить трэйлинг слеш – не самое удачное решение. Значительно лучше наоборот убирать. Но потребность в нем все же может быть, поэтому этот фильтр нужно или вообще выносить из фронта на уровень конфига сервера, или наоборот глубоко закапывать.
     
    #19 miketomlin, 5 май 2022
    Последнее редактирование: 5 май 2022
    yuri нравится это.
  20. yuri

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

    С нами с:
    16 янв 2012
    Сообщения:
    289
    Симпатии:
    2
    +1
     
  21. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Ещё раз переписал код уже раз пятый наверно, но уже с незначительными измененями
    PHP:
    1. <?php
    2. // Начинаем проверку полного УРЛ
    3. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    4. // Удаляем всё ненужное из УРЛ приводим к некому стандарту
    5. $clean_uri = str_replace(array('//', '\\', '\'', '"', ' ', '..', ',', '~', '<', '>', '%'), '', $uri, $count_error);
    6.  
    7. // Берём последний символ УРЛ строки что бы проверить чем УРЛ заканчивается
    8. $slesh = substr($clean_uri, -1);
    9. //Проверяем УРЛ на соответствие нашим высоким требованиям
    10. //Во первых проверяем есть ли слеш на конце УРЛ, а во-вторых есть ли некрасивые символы и повторы в УРЛ
    11. //Если нашли что то не устраивающее редиректим на эталонный УРЛ
    12. if($slesh!=='/' or $count_error > 0){
    13.     header('Location: /'.$clean_uri.'/');// Редиректим на адекватный УРЛ
    14.     exit;
    15. }
    16. //Если дошли до сюда значит УРЛ нам в целом нравится
    17. //Переходим к обработке принимаемых данных
    18. //Обрежем километровые запросы мне на сайте они не нужны
    19. $short_url = substr($clean_uri, 0, 200);
    20. //Создаём массив из УРЛ строки
    21. $segments = explode('/', trim($short_url, '/'));
    22. //Проверяем пришёл ли нам параметр для установки языка.
    23. //Это первый параметр который нужен
    24. //Если параметра нет здесь будет написана функция которая так или иначе добудет яыка и поставит его на место
    25. if(empty($segments[0])){
    26. header('Location: '.$_SERVER['REQUEST_URI'].'/rus/');
    27. } else {
    28. //Язык есть и УРЛ меня полностью устраивает поэтому покажем то за чем пользователь сюда пришёл
    29. include('main.php');    
    30. }
    31. //Проверяем пришли ли к нам какие то параметры (запросы)
    32. //Их ожидаем вторым эшелоном
    33. //Если они есть запихнём всё в сессию для дальнейшей работы
    34. if(!empty($segments[1])){
    35. $_SESSION['lang'] = $segments[0];
    36. $_SESSION['get'] = $segments[1];
    37. //Запускаем в работу полученные даныне
    38. include('search.php');
    39. }
    40. //Если каким то чудом пришло больше даных типа
    41. //site.ru/rus/а-я/всё/летала/но/я/так/и/знала/что/мечты/лишь/для/любви/лалала
    42. //По количеству символово это ешё укладывается в лимит 200 знаков
    43. //игнорировать не получится надо что то с этим делать забьём на них следующим образом
    44. if(!empty($segments[2])){
    45. header('Location: /'.$segments[0].'/'.$segments[1].'/');
    46. }
    47. ?>
    Кто разбирается ответьте это всё похоже на единую точку входа и роутинг или я всё же не понял. По поводу слешей мне там больше не надо так самый норм. Файл будут маленько по другому обрабатываться ещё не дошёл до этого.
     
    #21 AnteFil, 5 май 2022
    Последнее редактирование: 5 май 2022
  22. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.561
    Симпатии:
    1.284
    Адрес:
    Лень
    Чет нифига не понял почему мои посты почистились тут про Composer
     
  23. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    У меня нет таких прав это походу форум из бекапа восстанавливали
    --- Добавлено ---
    В общем я обдумал сказанное тобой и пересмотрел подход страницы действительно могут быть и должны быть по этому ещё раз чуть-чуть переписал
    PHP:
    1. <?php
    2. // Начинаем проверку полного УРЛ
    3. $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    4. // Удаляем всё ненужное из УРЛ приводим к некому стандарту
    5. $clean_uri = str_replace(array('//', '\\', '\'', '"', ' ', '..', ',', '~', '<', '>', '%'), '', $uri, $count_error);
    6.  
    7. // Берём последний символ УРЛ строки что бы проверить чем УРЛ заканчивается
    8. $slesh = substr($clean_uri, -1);
    9. //Проверяем УРЛ на соответствие нашим высоким требованиям
    10. //Во первых проверяем есть ли слеш на конце УРЛ, а во-вторых есть ли некрасивые символы и повторы в УРЛ
    11. //Если нашли что то не устраивающее редиректим на эталонный УРЛ
    12. if($slesh!=='/' or $count_error > 0){
    13.     preg_match_all("|(.*).html|", $clean_uri, $out, PREG_PATTERN_ORDER);
    14.     if(!empty($out[0][0])){
    15.         header('Location: /'.$out[0][0]);
    16.     exit;
    17.     } else {
    18.         header('Location: /'.$clean_uri.'/');// Редиректим на адекватный УРЛ
    19.     exit;
    20.     }
    21. }
    22. //Если дошли до сюда значит УРЛ нам в целом нравится
    23. //Переходим к обработке принимаемых данных
    24. //Обрежем километровые запросы мне на сайте они не нужны
    25. $short_url = substr($clean_uri, 0, 200);
    26. //Создаём массив из УРЛ строки
    27. $segments = explode('/', trim($short_url, '/'));
    28. //Проверяем пришёл ли нам параметр для установки языка.
    29. //Это первый параметр который нужен
    30. //Если параметра нет здесь будет написана функция которая так или иначе добудет яыка и поставит его на место
    31. if(empty($segments[0])){
    32. header('Location: /'.$_SERVER['REQUEST_URI'].'/rus/');
    33. } else {
    34. //Язык есть и УРЛ меня полностью устраивает поэтому покажем то за чем пользователь сюда пришёл
    35. include('main.php');    
    36. }
    37. //Проверяем пришли ли к нам какие то параметры (запросы)
    38. //Их ожидаем вторым эшелоном
    39. //Разделим запросы и страницы
    40. //Это запрос
    41. if(!empty($segments[1]) and empty($out[0][0])){
    42. $_SESSION['lang'] = $segments[0];
    43. $_SESSION['get'] = $segments[1];
    44. //Запускаем в работу полученные даныне
    45. include('search.php');
    46. }
    47. //Здесь страница
    48. if(!empty($segments[1]) and !empty($out[0][0])){
    49. switch($out[0][0]) {
    50.     case 'contact.html': include('contact.html');
    51.     case 'about.html': include('about.html');
    52. default:
    53.     case '404.html': include('404.html');
    54. }
    55. }
    56. //Если каким то чудом пришло больше даных типа
    57. //site.ru/rus/а-я/всё/летала/но/я/так/и/знала/что/мечты/лишь/для/любви/лалала
    58. //По количеству символово это ешё укладывается в лимит 200 знаков
    59. //игнорировать не получится надо что то с этим делать забьём на них следующим образом
    60. if(!empty($segments[2])){
    61. header('Location: /'.$segments[0].'/'.$segments[1].'/');
    62. }
    63. ?>
     
  24. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.561
    Симпатии:
    1.284
    Адрес:
    Лень
    @AnteFil

    Скачай то, что прикрепил к посту.
    Залей поверх папки OpenServer содержимое в архиве.
    Убедись что у тебя PHP 8.1 и перезапусти Локалку.

    Врубай у себя: http://Site

    Все что в публичном доступе, должен находится единственный php файл, все остальное - стили и картинки.
    В Nouvu тебя должно будет только интересовать папка userdata_phpdotru

    Маршрутизации роутера:
    userdata_phpdotru\Resources\System\RecreateRouting.php

    Контроллер твоих страничек:
    userdata_phpdotru\Resources\Controllers\MainController.php

    Это в целях ознакомления на моем фрейме.
    Изучай Composer для подключения готовых решений, без него никуда.
    --- Добавлено ---
    Ммм... ну ок
    https://disk.yandex.ru/d/nzeGEsvtAjy8Ig
     
    AnteFil нравится это.
  25. AnteFil

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

    С нами с:
    14 янв 2014
    Сообщения:
    518
    Симпатии:
    3
    Спасибо за информацию но не подходит
    Несколько дней гугления и разбирательств нашёл видосы на ютубе и в итоге имею вот такой класс. Прошу помочь дальше разобраться прошу прочитать больше мои комментарии нежели сам код. В общем нужны разьяснения, замечания, коментарии.
    PHP:
    1. <?php
    2. // создаём пространиство имён
    3. namespace core;
    4. // создаём класс Router
    5. class Router
    6. {//Обьявляем две переменные со статусом private что бы работали только в этом классе
    7.     private $routes = [];
    8.     private $params = [];
    9. //function __construct автоматически выполниться при подключении класса потомучто __construct
    10.     function __construct(){
    11. //Создадим масси с будущими страницами controller и action
    12. //Другими словами некий блок и отдельные элементы по аналогии с новостями например категория новсти и новость
    13.         $arr = [ "" => ['controller' => 'main', 'action' => 'index'], "account/login" => ['controller' => 'account', 'action' => 'login']];
    14. //Здесь я понимаю что перебираем массив для чего так и не понял    
    15.         foreach ($arr as $key => $val) {
    16.                 $this->add($key, $val);
    17.         }
    18.     }
    19. //Создаём функцию в которую передаём 2 значения
    20.     public function add($route, $params){
    21. //Создаем из $route регулярное выражение
    22.     $route = '#^'.$route.'$#';
    23. //Эта строчка не понятна
    24. //И тут же вопрос почему мы пишем функцию add если как то её уже выполнили ранее в __construct
    25.     $this->routes[$route] = $params;
    26.     }
    27. //Создаём функцию match
    28.     public function match(){
    29. //Смотрим в REQUEST_URI какой запрос пришёл к нам
    30.         $url = trim($_SERVER['REQUEST_URI'], '/');
    31. //Здесь перебираем опять непонтно что и зачем
    32.         foreach ($this->routes as $route => $params) {
    33. //Ищем по решулярке совпадения
    34.                 if(preg_match($route, $url, $matches)){
    35. //Здесь не понятно что происходит
    36.                 $this->params = $params;
    37. //В случае успеха если нашли возвращаем из функции true
    38.                 return true;
    39.             }
    40.         }
    41. //если не нашли запрашиваему страницу возвращаем false
    42.         return false;
    43.     }
    44. //Создаём фукцию run()
    45.         public function run(){
    46. //если функция match нашла запрашиваему страницу идум дальше если её нет то пишем ошибку
    47.         if($this->match()){
    48. //Запишем в переменную $path предпологаемый контроллер для страницы
    49.         $path = 'controller\\'.ucfirst($this->params['controller']).'Controller';
    50. //Страница есть проверим есть контроллер( другими словами категория,группа) для работы с этой страницей
    51.         if(class_exists($path)){
    52. //Запишем в $action    запрашиваемый элемент или обьект или новость
    53.             $action = $this->params['action'].'Action';
    54. //Контроллер есть проверим есть ли action ( другими словами конкретная страница, новость) в этом контроллере (группе)
    55.                 if(method_exists($path, $action)){
    56. //Контроллер есть и экшен есть поэтому мы передаём запрашиваемыые параметры в них          
    57.                     $controller = new $path($this->params);
    58.                     $controller->$action();
    59.                 } else {
    60.                     echo 'Не найден экшен '.$action;
    61.                 }
    62.      
    63.             }    else {
    64.                 echo 'Не найден: '.$path;
    65.             }
    66.         } else {
    67.             echo 'Нет маршрута';
    68.         }
    69.     }
    70.  
    71. }
    72. ?>
    Сам контроллер
    PHP:
    1. <?php
    2. namespace controller;
    3. use core\Controller;
    4. class AccountController extends Controller{
    5.     public function loginAction(){
    6.         echo 'Есть';
    7.     }
    8.     public function registerAction(){
    9. echo 'Есть';
    10.     }
    11. }
    12. ?>
    И страничка index.php
    PHP:
    1. <?php
    2. //Старт сессии
    3. //подключаем правила
    4. require 'core/Router.php';
    5. //подключаем пространство имён
    6. use core\Router;
    7. //автозагрузка класса
    8. spl_autoload_register(function ($class) {
    9.     $path = str_replace('\\','/', $class.'.php');
    10.    if(file_exists($path)){
    11.        require $path;
    12.    }
    13. });
    14. ///запуск правил роутинга
    15. $router = new Router;
    16. $router->run();
    17. ?>