Нет, это вкусовщина. Кому-то по нраву парсить строку запроса руками, кому-то по нраву в GET заглянуть.
ну туда-то она попадает сама волшебным образом а в гет её ещё надо запихать правильным конфигом, при этом возникает черезжопное засовывание гет-параметров куда-то, либо возможность конфликта имён гет-переменных, прилетающих в запросах, с техническими, используемыми в конфиге. По мне так это муть и лишние движения. А если лишние - отрезаем
Чот ты описал проблемы, которые вот если самому себе не сделать - никогда и не возникнут, если честно.
Всем пример покажу скрипт роутер который написал @MouseZver: PHP: <?php # Проверяем существование указанной именованной константы defined ('FLAG') or die ( 'произошла не известная ошибка!' ); # define — Определяем именованную константу для папки page define ( 'DIR_INCLUDE', dirname ( __FILE__ ) . DIRECTORY_SEPARATOR ); # выводим ошибки на экран error_reporting ( E_ALL ); # Запускаем сессию session_start (); # Подключаем базу require ( $_SERVER['DOCUMENT_ROOT'].'/system/data/mysql.php' ); # Класс роутер class Router { const PAGE_DEFAULT = 'start'; # скрипт по умолчанию который будет загружаться public static $DEFAULT_TEMPLATE = 'default'; # Шаблон по умолчанию который будет загружаться } ob_start (); # создаем сам роутер чпу переключатель $router = explode ( '/', mb_strtolower ( trim ( parse_url ( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), ' /' ), 'UTF-8' ) ?: Router::PAGE_DEFAULT ); $DIR = implode ( DIRECTORY_SEPARATOR, [ DIR_INCLUDE, 'page', $router[0] ] ) . '.php'; # если стр такая сущестует грузим ее иначе на ошибку пускаем if ( file_exists ( $DIR ) ) { require $DIR; } else { echo 'Запрошенная страница не найдена'; } $OB_CONTENTS = ob_get_contents (); ob_end_clean (); # Выводим веб страницу в контенте require ( dirname ( __FILE__, 2 ) . '/templates/view.php' ); Но вот что мне не нравится, этот скрипт может работать только с htaccess с такими настройками PHP: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php И только с такими, если эти настройки я хочу поменять на такие: PHP: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php То он вообще не фуричит не работает. Этот скрипт роутер должен подгружать все скрипты которые находятся в папке page если я вообще уберу настройки .htaccess то он не работает грузит по дефолту одну страницу start.php а все остальные игнорирует не смотря на какую страницу хочу перейти, типа там таких скриптов нет! Что нужно и где изменить чтобы корректно работал роутер?
Ну вообще, первый htaccess - это традиционное решение, называется единая точка входа. Второй htaccess - непонятно, нафига тебе тогда роутер, если ты хочешь каждый запрос на свой файл слать? Ну и ставь тогда ссылки каждый раз прямо на php-файлы, в чём проблема? Смысл роутера в том, что сервер тебе прислал запрос на index.php, а там ты уже можешь любую логику распределения путей запрограммировать.
@mkramer то-есть первый htaccess правильный второй нет, просто когда я пишу или разбираю код js то там нужно указывать названия файла, а если я в этот момент использую htaccess то полное названия файла я не могу указать, из-за htaccess я в нем режу .php расширения. Помоги пожалуйста как мне быть.
В js тебе не обязательно писать имя php-файла, можно и маршрут указывать. Вот у меня в текущем проекте ajax-запросы идут на маршруты типа Код (Text): /admin/json/tasks/get/12 а на стороне это всё разбирается, и возвращает то, что надо, в ожидаемом формате (json-е). Это раз. Два, в первом htaccess, как и полагается, указано, чтоб на index.php перенаправлялись только запросы на несуществующие файлы, если укажешь имя существующего php файла, то выполнится он сам. Всё потому, что ты вообще слабо себе представляешь как всё работает, и разбирать не хочешь... К тебе на сервер пришёл запрос, дальше ты и только ты решаешь, что ты на этот запрос выдашь клиенту. Хочешь - сформированный html, хочешь - json, хочешь - pdf, хочешь - картинку, хочешь mp3 и т.п. А чужим кодом, не разобравшись, пользоваться не нужно.
@mkramer Люблю такую критику, аж дух поднимает пока хочу без htaccess поработать потом когда понадобится и с ним буду работать, ну вот проблема что без него работать не хочет.
Чтоб без него роутер работал, надо роуты гет-параметрами кидать. --- Добавлено --- что-то вроде Код (Text): /index.php?r=task/get&id=12
@mkramer Типа то что мы разбирали выше когда то? Если да придется огромный массив ссылок сделать иногда это аж не удобно. PHP: /index.php?r=task/get&id=12 Куда обычно это прописывают?
Дофига подходов. Я пользуюсь фреймворками. Я тебе давал и вариант с массивом, и без массива. С классами не давал - но ты и не поймёшь Я вообще самостоятельно роутеры не пишу - за меня уже умные люди написали, во фреймворки упаковали . Но я читаю код, и понимаю, как это работает
Так ты теорию нифига не знаешь. Ни про автолоадер, ни про задание имени класса через строковую переменную, тебе бесполезно кидать. --- Добавлено --- https://secure.php.net/manual/ru/language.oop5.php https://secure.php.net/manual/ru/language.namespaces.php https://php.ru/manual/function.spl-autoload-register.html
Теорию почитаю, не обижай ка меня а то я тебе, а что я тебе надо быть оптимистом, и верить в меня и раньше времени не наказывать и не угадывать что знаю а что нет. Вот нашел роутинг нормальный ли? http://www.itlessons.info/php/routing-library/ --- Добавлено --- От того что я прочитаю, не чего не изменится я все ровно понимать сразу не начну, мне туго доходит, ну очень туго) за ссылки спасибо, примерчики и учителя предоставьте за недельку учебы я выучу то что учится за год от зубов все что выучил будет отскакивать, буду покорять веб программирование) --- Добавлено --- Можешь писать что угодно но я не сдамся, я по чуть чуть развиваюсь, больно сильно упертый я и настойчивый.
Упорство это хорошо, только смени вектор его, начни изучать язык, а не копипастить примерчики. Роутер, что привёл - ну вроде ничего, хотя можно и поинтереснее найти. Ведь если ты начнёшь работать, всё скопипастить не получится, надо будет писать самому. Вот возьми, разбери теорию внимательно. Выпиши вопросы, что не понятно, запости сюда, тебе ответят. Потом следующую страничку разбери.
@mkramer Могу с уверенностью сказать что основы языка я точно выучил, и условие могу написать не сложное, а вот основы методов интерфейсов и классов, точно не знаю, пошел читать. Что будет не понятно напишу.
У меня роутер работает так: 1. парсим $_SERVER['REQUEST_URI'] и пишем в массив $url; 2. если $url[1] нет, отдаем главную страницу; 3. если $url[1] есть, ищем контроллер в папке контроллеров; 4. контроллера нет, отдаем 404; 5. контроллер есть, смотрим есть ли $url[2]; 6. если нет ищем в контроллере indexAction; 7. если находим, отдаем содержимое, если нет отдаем 404; 8. если есть $url[2], ищем $url[2]Action в контроллере; 9. если есть отдаем содержимое, если нет то отдаем 404. Помимо этого есть еще список псевдонимов, переадрессаций и т.п.
Вот, только не помню это конечный вариант или нет) PHP: <?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ namespace app; class Route { public $redirectList = []; //массив строк для переадрессации //['/url' => '/redirectUrl'] public $exceptionList = []; //массив строк для адресов-исключений //['/url' => '/controller/action'] public $controllerPath; //путь к папке с контроллерами //проверка на запрещенные символы private function checkSymbol($url) { if(preg_match('/^[a-z0-9-\/]*$/i', $url)): return TRUE; else: Logging::log()->create([__CLASS__,'Использованы запрещённые символы.']); return FALSE; endif; } //проверка на переадресацию private function checkRedirect($url) { if(array_key_exists($url, $this->redirectList)): return $this->redirectList[$url]; else: return FALSE; endif; } //проверка на адрес-исключение private function checkException($url) { if(array_key_exists($url, $this->exceptionList)): return $this->exceptionList[$url]; else: return FALSE; endif; } //парсинг url-строки private function parseUrl() { $url = $_SERVER['REQUEST_URI']; $result = []; if($this->checkSymbol($url) === TRUE): $checkRedirect = $this->checkRedirect($url); if($checkRedirect === FALSE): $checkException = $this->checkException($url); if($checkException === FALSE): $urlArr = explode('/', substr($url, 1)); else: $urlArr = explode('/', substr($checkException, 1)); endif; for($i = 0; $i < sizeof($urlArr); $i++): if($i === 0): $key = 'controller'; elseif($i === 1): $key = 'action'; elseif($i > 1): $key = 'link_'.($i - 1); endif; $result[$key] = $urlArr[$i]; endfor; else: $result['redirect'] = $checkRedirect; endif; else: $result['error'] = '404'; endif; return $result; } //проверка контроллера на существование public function checkController() { $routeResult = $this->parseUrl(); if(!array_key_exists('redirect', $routeResult) && !array_key_exists('error', $routeResult)): if(isset($routeResult['controller'])&& isset($routeResult['action'])): if(!file_exists($this->controllerPath.$routeResult['controller'].'Controller.php')): Logging::log()->create([__CLASS__,'Файл контроллера не найден.']); $routeResult['error'] = '404'; endif; else: Logging::log()->create([__CLASS__,'Обращение к несуществующим контроллеру/экшену.']); $routeResult['error'] = '404'; endif; endif; return $routeResult; } }
Зачем тебе мой класс? Мой класс написан как элемент системы. Для его работы необходимо несколько других классов и файлов. Ты пиши свой роутер, иначе ты не научишься ничему