Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Уже написали smile Разработчики PHP smile
http://ru2.php.net/manual/ru/function.parse-str.php

Автор: mishaSL 18.1.2007, 13:56
Цитата(Gold Dragon @  18.1.2007,  12:30 Найти цитируемый пост)
вот и нужно из неё вытаскивать нужные параметры, проверять есть или нет и так далее.


Странная какая-то идея, есть же  массив $_GET и предопределенные переменные. А что там еще "так далее"?

Добавлено @ 13:59 
Ссори я наверное просто не понял вопрос, если чужие адресные строки обрабатывать, то тогда 
AztEK, прав, parse_str()  тебе в помощь.

Автор: Gold Dragon 18.1.2007, 14:01
AztEK, это немного не то... это может быть одной из функций класса.

Может я не так объяснил.. попробую ещё раз.

Когда страница загружается и считывается заголовок, то я каждуй раз вычлиняю необходимые переменные, их значения. Проверяю вообще на их наличие/отсутсвие. Проверяю допустимость значений, проверяю разрешённость значений и переменных и т.п. и т.д.

Это мне приходиться писать постоянно. Вот я и хочу сделать просто класс и когда мне нужно вызывать то или иное.

Просто я видел такие классы в нескольких CMS, но разобраться там слишком пока для меня сложно  smile 

Автор: 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
работаю с такой функцией, причем вызывается она ДО создание объекта ядра:
Код

    function glGetURI( $uri , $path )
    {
        $t = parse_url( $uri );
        $uri = preg_replace( "#/+#" , "/" , $t['path'] );

        $t = parse_url( $path );
        $uri = preg_replace( "#(^" . preg_quote( $t['path'] ) . "|\.\./|/$)#" , "" , $uri );
        
        return explode( "/" , $uri );
    }


На выходе получая массив параметров, с которым очень удобно работать.

Автор: SamDark 18.1.2007, 16:23
Mal Hack, 
Не понял... Зачем руками парсить, когда всё в GET пойдёт и так?

Автор: Gold Dragon 18.1.2007, 16:36
Цитата(SamDark @  18.1.2007,  15:29 Найти цитируемый пост)
Может покажешь, как это обычно выглядит в коде и как хочешь, чтобы это выглядело?

Да выглядит просто. Допустим у меня есть такая переменная в адресной строке как Id. вот что мне приходится с ней делать

- проверка на наличие самой переменной
- проверка значения на null
- проверка значения на содержание только цифр
- сверка значения с шаблонами

эти действия я делаю как подряд, так и в произвольном порядке. Вот и хотелось это всё упорядочить

mod_rewrite для меня сложноват. Вернее я ещё в нём не раздирался. Могу использовать его только как попугай - тупо переписывать, не понимаю сути.  smile 

ps
Mal Hack, я пока делаю сайты как их вижу (без планирования) хотя уже начал по немногочто-то систематизировать. Но понятие ядра для меня ещё очень туманное. Может новый топик создать, а то я опять с середины начинаю smile

Автор: Mal Hack 18.1.2007, 16:37
_http://mysite.com/par1/par2/par3/par4
Что тут в $_GET пойдет?

Автор: mishaSL 18.1.2007, 17:21
Цитата(Gold Dragon @  18.1.2007,  16:36 Найти цитируемый пост)
проверка на наличие самой переменной
- проверка значения на null
- проверка значения на содержание только цифр
- сверка значения с шаблонами

эти действия я делаю как подряд, так и в произвольном порядке. Вот и хотелось это всё упорядочить

mod_rewrite для меня сложноват. Вернее я ещё в нём не раздирался. Могу использовать его только как попугай - тупо переписывать, не понимаю сути. 


Проще разобраться с mod_rewrite тогда не надо будет всего этого делать. Тем более это будет гораздо лучше и систематизированее.


Автор: Gold Dragon 19.1.2007, 08:28
Цитата(Mal Hack @  18.1.2007,  16:37 Найти цитируемый пост)
_http://mysite.com/par1/par2/par3/par4Что тут в $_GET пойдет?
ну ты спросил.. smile Я не знаю.

Я так и не понял, mod_rewrite вроде в данном случае служет для "нормального" отображения самой адресной строки. Но я то малость о другом спрашиваю.. smile 

Автор: SamDark 19.1.2007, 09:54
Mal Hack, 
При использовании в mod_rewrite правила
Код

RewriteRule ^(\w+)/(\w+)/(\w+)/(\w+)[/]?$ index.php?p1=$1&p2=$2&p3=$3&p4=$4

в $_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,  09:54 Найти цитируемый пост)
Похоже, тебе нужен класс валидации. 

ну может быть, может быть...

Цитата(SamDark @  19.1.2007,  09:54 Найти цитируемый пост)
- приведение значения к определённому типу или сверка значения с шаблонами (возможно с регулярными выражениями)

наверное всё же не ИЛИ. Это разное. Иногда нужно одно, иногда другое, иногда и то и другое.

Автор: SamDark 19.1.2007, 13:11
Gold Dragon, 
Да, наверное, всё-таки разное. Как-нибудь на днях усядусь за это дело...

Автор: Mal Hack 19.1.2007, 15:06
Gold Dragon, я тебе просто, как вариант, привел другое возможное реализационное решение.

SamDark, я говорил именно про тот вид правил, который я описал в статье.


Цитата(SamDark @  19.1.2007,  09:54 Найти цитируемый пост)
Похоже, тебе нужен класс валидации. Дело хорошее. Сам об этом задумываюсь.

Немного приведу в порядок список желаемых фич:

- приведение значения к определённому типу или сверка значения с шаблонами (возможно с регулярными выражениями)
- проверка существования значения. Если не существует - выброс исключения, либо использование умолчания. 

Тут есть маленькая проблема. Все входные параметры нужно проверять там, где они используются, а не в самом начале скрипта. Например, может получиться такая вещь, что мы преобразуем входные параметры, а потом нам понадобится исходное значение.

Автор: SamDark 19.1.2007, 15:15
Mal Hack, 
Естественно сразу всё обрабатывать не стоит. Но по-моему легче пользоваться валидатором:
Код

print Validator::GET->getEmail('email');
print Validator::POST->getSQLParam('page');

Автор: 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, 
Не понял, чем плохо выкидывать его в классе.
Код

try{
  $mail = Validator::GET->getEmail('email');
}
catch (Exception $e) {
  print 'Invalid e-mail.';
}

Автор: Mal Hack 19.1.2007, 16:00
Ну не правильно это с точки зрения проектирования. Ошибка должна генерироваться там, где она происходит.
try в данном случае не уместен, если ты try не используешь на все прострнаство кода.
Таким образом, при неправильно заполненной форме регистрации ты не сможешь вывести пользователю его ошибку и новую форму

Автор: SamDark 19.1.2007, 16:13
Цитата
try в данном случае не уместен

Почему?

Автор: Mal Hack 19.1.2007, 17:08
Цитата(Mal Hack @  19.1.2007,  16:00 Найти цитируемый пост)
Таким образом, при неправильно заполненной форме регистрации ты не сможешь вывести пользователю его ошибку и новую форму 


Автор: SamDark 19.1.2007, 22:41
Код

try{
  $mail = Validator::GET->getEmail('email');
  //выводим результат обработки
}
catch (InvalidEmailException $e) {
  //выводим форму с пометкой, что адрес неправильный
}

Автор: Mal Hack 20.1.2007, 00:02
SamDark, а как ты будешь действовать, если у тебя мыло проверяется на 10-12 формах проекта?
Я клоню к тому, что проверка ошибок и их вывод - на ядре, а вот реакция на ошибки - в модуле...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)