Вебмастеру

 
 
15

URL rewrite - эмуляция адреса

  • Категория: php
Поделитесь опытом работы с эмуляцией URL адресов в рамках фреймворка.

Мне нужно чтобы при обращении по адресу /user/George шел перехват запроса движком и выполнялось действие Info в контроллере User, с передачей ему параметра George.

Интересует в каком фреймворке описание правил реализовано наиболее наглядно и удобно для использования. Я так понимаю, что при нескольких десятках похожих правил в их можно запутаться и одно правило сможет перекрыть другое. Именно поэтому интересует "ясность" и прозрачность описания таких вот адресов.
 
 
1

Константин

  • группа: Гости
к примеру так:
файл .htaccess

<ifModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([a-zA-Z0-9\-\_\.\/\\]{0,224})$ index.php?show_uri=$1 [L,QSA]

</ifModule>

а в скрипте разбиваеш переменную $_GET['show_uri'] на массив. А далее обрабатывай значения по их индексу.
т.е.

$show_uri_arr = explode("/", $_GET['show_uri']);

будет:
$show_uri_arr[0] = "user";
$show_uri_arr[1] = "George";

это простой пример. доработать сможешь ведь.
 
 
2

Антон

  • группа: Гости
Вопрос не о .htaccess. Вопрос о более высоком уровне - обработке в самом движке. У нас одна цель .htaccess - передавать все запросы index.php и все.
 
 
3

Грэй

  • группа: Гости
понаехло тут урлрерайтщиков блин

Один из лучших - это django. Второй - sf.

Соль простая.
Существует 2 вида получения параметров из урла:
1. На основе регулярки. В django очень даже это дело понравилось - сразу задаются и имена параметров и модуль и действие.
При этом нет никаких ограничений - можете хоть иметь урл вроде:
/user-info-someuser.showcomment
При этом будем иметь модуль user, экшн info, параметр someuser и ещё один параметр showcomment. Про регулярки думаю не стоит рассказывать. Стоит вообще это дело посмотреть как работает
2. Автоматический.
Имеем урл:
/user/show/id/1

Каждый параметр разделен слешем.
Первый параметр - модуль. Второй - экшн. Третий - имя параметра. четвертый - его значение
 
 
4

Антон

  • группа: Гости
Если Вы посмотрите на наш фреймворк, то заметите что приведенные выше вещи он уже делает. Правда, по регуляркам пока не реализован реврайтер. Мне важно увидеть именно реализацию, как следует описывать правила.

Конечно, если вы реализуете реврайтер для нашего проекта - это будет большой вклад в развитие нашего open source проекта. Однако и советы от опытного разработчика всегда являются для нас незаменимой помощью.

Спасибо за комментарий!
 
 
5

Антон

  • группа: Гости
Спасибо. Опять не о том.

Адрес стандартен для ZendFramework и других MVC фреймворков: /model/action/params...

Вот нужно сделать реврайтер для нестандартных ситуаций. Например, есть задача сделать так: project_name/bugs/list рассматривать как bugs/list/project:project_name

Т.е. человек видит одно, а система понимает это как совершенно другие команды, выходящие за рамки стандартной MVC архитектуры.

Надеюсь, теперь я более понятно пояснил чего хочу.
Спасибо за предложения.
 
 
6

Грэй

  • группа: Гости
once more - регулярка
 
 
7

Антон

  • группа: Гости
О, регулярка. Это хорошо. Дошли до сути.

Уточняю. Желаю определить стиль описания реврайтов, чтобы было удобно писать эти реврайты для больших сайтов. Ведь урлы могут пересекаться - а это уже плохо. Вот именно поэтому я и желаю выбрать лучший вариант из предлагаемых.

Пример плохого реврайта:
[a-z]+[0-9]{1,4} -> user/$1
[a-z0-9]+ -> article/$1

При определенной ситуации (например: user124) получаем коллизию - пересечение двух правил. Это очень плохо. Именно этого следует избежать.

Теперь слушаю Ваши предложения по решению этой задачи. просьба заранее просмотреть различные источники, чтобы сэкономить свое время и быстрее получить ответ на этот вопрос.

Спасибо.
 
 
8

Грэй

  • группа: Гости
на самом деле да, пример очень плохой.
Я бы всё таки не стал удалять совсем понятия модуля в урлах.
Таким образом, лучше сделать регулярки вроде
user\/[a-z]+[0-9]{1,4} -> user/$1
article\/[a-z0-9]+ -> article/$1

если быть более точным - паттерн применяется дважды:
1. Для сравнения паттерна с урлом и определение приложения, модуля, действи - пересечение полностью на совести разработчика
2. Обозначение параметров. Например:
article\/(?<alias>\w+)
Сделал preg_match_all - получим совпадения, а заодно и ключи.
В данном случае вытащим параметр alias, который потянется в контроллер
 
 
9

Антон

  • группа: Гости
Если есть желание - можешь помочь в реализации этого модуля. Однако, придется изучить хотя бы 5 различных подходов, используемых в разных фреймворках. (это своего рода инвайт в прокт phpDays)

Пример из жизни. Создается сайт для ведения проектов.
На первом месте в УРЛ стоит название проекта. Далее уже идет имя контроллера и действия.

/[project_name]/code/view -> /code/view/project:project_name

При этом мы оставляем систему и код приложения "прозрачными", и пользователь видит удобные УРЛы для себя.

Последнюю версию кода класса Router смотрим здесь:
http://http://code.google.com/p/phpdays/so.../browse/trunk...
(хотя в данный момент он пуст)
 
 
10

Алексей

  • группа: Гости
http://http://site.ru/[controller]/[action]/[args]/[args]...

http://http://site.ru/users/napeHeK/news/

$controller = 'users';
$action = 'napeHeK';
$subaction = 'news';

$controller = new $controller();
$controller->$action($subaction);

class users
{
. . . function __call($username, $args)
. . . {
. . . . . . $subaction = $args[0];
. . . . . . echo $username;
. . . }
}

Общепринятый вид, не думаю что нужно прыгать выше головы. А регулярки не стоит использовать, слишком они медленные.

* Тут берётся только один параметр, для упрощения. Я обычно делаю отдельный класс для разбиения запроса и хранения кусков. А контроллер уже сам делает валидацию и берёт все что нужно
 
 
11

Алексей

  • группа: Гости
В .htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?$1 [L,QSA]

Думаю не стоит нагружать с лишними регулярками, нет смысла
 
 
12

Грэй

  • группа: Гости
Сравнить одну строку - слишком медленные?
echo быстрее print, да?
 
 
13

Алексей

  • группа: Гости
Какую строку вы сравниваете? Мы вроде говорили о разбивке запроса...

/[project_name]/code/view -> /code/view/project:project_name

explode (может быть и strpos) будет работать раз в 20 быстрей, чем preg_match

echo быстрее print, да? Да, вы думаете по другому? :)
 
 
14

Антон

  • группа: Гости
Да, нужно внедрить будет простой рврайтинг. Как я вижу. некоторые фрейворки вообще не обрабатывают запросы. если реврайт не прописан (тот же Django). Вообще это с одной стороны правильно - я не ко всем контроллерам даю доступ. а только к тем, что я считаю нужным. Да и не ко всем методам. а только к тем. что я разрешил.

Нужно подумать как это внедрить. Штука действительно хорошая. Но сейчас все еще я применяю автоматическую маршрутизацию по принципу Zend Framework.

Спасибо за идеи. Будут свежие мысли - пишите, будем внедрять.
 
 
15

Александр

  • группа: Гости
Алексей Светов
ужастнейший способ, имхо. код громостким выходит
 
 
Регистрация

Популярные статьи

» Mozilla Firefox: помощь и взаимоподдержка. Спрашиваем, ...
» Вопросы от новичков...
» перешли ли вы 100% на линукс без установленной параллел ...
» Ваши любимые плагины и дополнения
» Ответы на вопросы по PHP
» Какие CMS ВЫ предпочитаете - (плюсы и минусы)
» FAQ: вопросы и ответы
» Вопросы и консультации
» Другие браузеры (голосование!)
» Зарплата PHP программиста