| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Класс для обработки адресной строки |
| Автор: Gold Dragon 18.1.2007, 12:30 |
| В общем решил я потихоньку переходить на class`ы и возникла такая задача. Как мне грамотнее сделать обработку адресной строки чтобы управлять самим контентом. Т.е. есть к примеру строка http://buw.ru/index.php?option=com_datsogallery&Itemid=13 вот и нужно из неё вытаскивать нужные параметры, проверять есть или нет и так далее. Наверняка кто-то уже писал... Мне хотябы теории малость, но от примеров не откажусь |
| Автор: AztEK 18.1.2007, 12:35 |
| Уже написали http://ru2.php.net/manual/ru/function.parse-str.php |
| Автор: Gold Dragon 18.1.2007, 14:01 |
| AztEK, это немного не то... это может быть одной из функций класса. Может я не так объяснил.. попробую ещё раз. Когда страница загружается и считывается заголовок, то я каждуй раз вычлиняю необходимые переменные, их значения. Проверяю вообще на их наличие/отсутсвие. Проверяю допустимость значений, проверяю разрешённость значений и переменных и т.п. и т.д. Это мне приходиться писать постоянно. Вот я и хочу сделать просто класс и когда мне нужно вызывать то или иное. Просто я видел такие классы в нескольких CMS, но разобраться там слишком пока для меня сложно |
| Автор: mishaSL 18.1.2007, 14:50 |
| По-моему лучший вариант это пользоваться mod_rewrite. Тогда на уровне сервера проверяется. И данные уже проходят первичную проверку. Я делаю так: 1. Весь сайт написан с использованием mod_rewrite 2. В самом начале скрипта проверяешь массив $_GET и удаляешь все не нужные символы, к примеру если у тебя в системе не используются символы $, :, / то убираешь их. 3. Если есть какие-то специфические проверки, то это уже проверяется на уровне модуля к которому обращаются. |
| Автор: SamDark 18.1.2007, 15:29 |
| Gold Dragon, Сама идея достаточно спорная. Созданием класса просто усложняется синтаксис и замедляется выполнение скрипта. И что всё-таки значит вычленять переменные? Может покажешь, как это обычно выглядит в коде и как хочешь, чтобы это выглядело? |
| Автор: Mal Hack 18.1.2007, 15:49 | ||
| Это все лишнее. Ты должен сделать ядро системы, куда должны войти функции разбора строки запроса с нужными проверками.... И то, лишнее Лично я, используя mod_rewrite, как написано тут: http://vingrad.ru/WEB-SERVER-002835 работаю с такой функцией, причем вызывается она ДО создание объекта ядра:
На выходе получая массив параметров, с которым очень удобно работать. |
| Автор: SamDark 18.1.2007, 16:23 |
| Mal Hack, Не понял... Зачем руками парсить, когда всё в GET пойдёт и так? |
| Автор: Gold Dragon 18.1.2007, 16:36 | ||
Да выглядит просто. Допустим у меня есть такая переменная в адресной строке как Id. вот что мне приходится с ней делать - проверка на наличие самой переменной - проверка значения на null - проверка значения на содержание только цифр - сверка значения с шаблонами эти действия я делаю как подряд, так и в произвольном порядке. Вот и хотелось это всё упорядочить mod_rewrite для меня сложноват. Вернее я ещё в нём не раздирался. Могу использовать его только как попугай - тупо переписывать, не понимаю сути. ps Mal Hack, я пока делаю сайты как их вижу (без планирования) хотя уже начал по немногочто-то систематизировать. Но понятие ядра для меня ещё очень туманное. Может новый топик создать, а то я опять с середины начинаю |
| Автор: Mal Hack 18.1.2007, 16:37 |
| _http://mysite.com/par1/par2/par3/par4 Что тут в $_GET пойдет? |
| Автор: mishaSL 18.1.2007, 17:21 | ||
Проще разобраться с mod_rewrite тогда не надо будет всего этого делать. Тем более это будет гораздо лучше и систематизированее. |
| Автор: Gold Dragon 19.1.2007, 08:28 |
| ну ты спросил.. Я так и не понял, mod_rewrite вроде в данном случае служет для "нормального" отображения самой адресной строки. Но я то малость о другом спрашиваю.. |
| Автор: SamDark 19.1.2007, 09:54 | ||
| Mal Hack, При использовании в mod_rewrite правила
в $_GET[] попадут все 4 параметра с известными индексами. mishaSL, Полностью на mod_rewrite полагаться не стоит. Злые люди могут обратиться к скрипту напрямую. Gold Dragon, Похоже, тебе нужен класс валидации. Дело хорошее. Сам об этом задумываюсь. Немного приведу в порядок список желаемых фич: - приведение значения к определённому типу или сверка значения с шаблонами (возможно с регулярными выражениями) - проверка существования значения. Если не существует - выброс исключения, либо использование умолчания. |
| Автор: Glip 19.1.2007, 10:21 |
| http://www.onphp.org/doxy/0.8.4/de/d5d/classBasePrimitive.html BasePrimitive и его наследники |
| Автор: SamDark 19.1.2007, 10:35 |
| Glip, Ну, это не совсем то. Делать обёртки для примитивов == сильное замедление выполнения. |
| Автор: Glip 19.1.2007, 10:49 |
| Не настаиваю, просто как вариант. Мне например очень удобно. А замедление выполнения, не силно заметно на фоне скорости обмена с субд |
| Автор: Gold Dragon 19.1.2007, 11:51 | ||
ну может быть, может быть...
наверное всё же не ИЛИ. Это разное. Иногда нужно одно, иногда другое, иногда и то и другое. |
| Автор: SamDark 19.1.2007, 13:11 |
| Gold Dragon, Да, наверное, всё-таки разное. Как-нибудь на днях усядусь за это дело... |
| Автор: Mal Hack 19.1.2007, 15:06 | ||
| Gold Dragon, я тебе просто, как вариант, привел другое возможное реализационное решение. SamDark, я говорил именно про тот вид правил, который я описал в статье.
Тут есть маленькая проблема. Все входные параметры нужно проверять там, где они используются, а не в самом начале скрипта. Например, может получиться такая вещь, что мы преобразуем входные параметры, а потом нам понадобится исходное значение. |
| Автор: SamDark 19.1.2007, 15:15 | ||
| Mal Hack, Естественно сразу всё обрабатывать не стоит. Но по-моему легче пользоваться валидатором:
|
| Автор: Mal Hack 19.1.2007, 15:19 |
| Исключения должны генерироваться уже в самом коде, где эта проверка и должна проходить. Только так мы сможет четко видеть где и что у нас - не так и нормально вывести ошибку. |
| Автор: SamDark 19.1.2007, 15:25 |
| Mal Hack, Ну как раз в классе Validator::что_то_там можно выкинуть исключение. |
| Автор: Mal Hack 19.1.2007, 15:32 |
| SamDark, но выкидывать его надо не в начале, а по время работы. Если, конечно, ты не хочешь сделать вросто что-то вроде настроек проверки...И исходя из того, что венет функция (true|false) - выкидывать Exception |
| Автор: SamDark 19.1.2007, 15:46 | ||
| Mal Hack, Не понял, чем плохо выкидывать его в классе.
|
| Автор: Mal Hack 19.1.2007, 16:00 |
| Ну не правильно это с точки зрения проектирования. Ошибка должна генерироваться там, где она происходит. try в данном случае не уместен, если ты try не используешь на все прострнаство кода. Таким образом, при неправильно заполненной форме регистрации ты не сможешь вывести пользователю его ошибку и новую форму |
| Автор: SamDark 19.1.2007, 16:13 | ||
Почему? |
| Автор: Mal Hack 19.1.2007, 17:08 | ||
|
| Автор: SamDark 19.1.2007, 22:41 | ||
|
| Автор: Mal Hack 20.1.2007, 00:02 |
| SamDark, а как ты будешь действовать, если у тебя мыло проверяется на 10-12 формах проекта? Я клоню к тому, что проверка ошибок и их вывод - на ядре, а вот реакция на ошибки - в модуле... |