Как обычно реализуют многоуровневую виртуальную структуру URL?

Adelf

Administrator
Команда форума
просто делаем URL вида

/catalog/sotovaja_svjaz/phones/siemens/42/42.xhtml

и роутер сам поймет, что этот URL, с постфиксом .xhtml - для товара. А ID товара сответственно будет предшествующая постфиксу цифра.
Ты здесь вступаешь на очень узкую тропку.
 

Духовность™

Продвинутый новичок
сказал а, говори б. В чем узость?

-~{}~ 02.07.10 17:37:

Автор оригинала: c0dex
Я ленивый и храню в виде id-parentid и на этапе обработки адреса /company/about/ выбираю все дерево и клепаю массив из дерева с алиасами, а потом сравниваю с адресом в цикле. Все это можно еще и закешировать, но мне лично пока хватает времени генерации страницы в районе 0,003 сек. =^..^=
можно увидеть структуру и небольшой дамп такого решения? и как динамичские URL хранятся, например как в примере с вакансиями?
 

Adelf

Administrator
Команда форума
и роутер сам поймет, что этот URL, с постфиксом .xhtml - для товара. А ID товара сответственно будет предшествующая постфиксу цифра.
У тебя роутер получится черезчур всезнающий. Это не его забота. Он должен найти контроллер и передать тому управление. А уже контроллер должен понять, где там ID товара.
 

Духовность™

Продвинутый новичок
зачем контроллеру заниматься поиском ID товара из URL? это не задача контроллера ни разу. Контроллер должен получить запрос и отработать.
 

vovanium

Новичок
Вы предлагаете перед КАЖДЫМ запросом стоить дерево из таблицы путей
Разбиваешь url на кусочки и потом пробегаешься по массивчику упрощенно
PHP:
$tree = array(
0 => array( // дети рута
    'company' => array('id' => 1, 'type' => 'page'),
    'news' => array('id' => 2, 'type' => 'news'),
),
1 => array( // дети для id=1
    'news' => array('id' => 3, 'type' => 'news'),
)
);
получил путь к примеру company/news/2010, проверил $tree[0]['company'], проверил есть ли вложенный с именем news, т.е. $tree[1]['news'], больше детей нет "2010" передал модулю news. Причем как видишь умышленно два модуля news, так как к примеру зачастую в корпоративных сайтах, есть чисто новости компании, а есть новости отрасли в которой они работают.
Массивчик легко строится, и просто кэшируется.
triumvirat
я с этим не согласен и поэтому
ага а программы на компе более логично хранить так

Код:
dll/prog1
   /prog2
exe/prog1
   /prog2
txt/prog1
   /prog2

а не 

prog1/dll
     /exe
     /txt
prog2/dll
     /exe
     /txt
 

Духовность™

Продвинутый новичок
vovanium
Ок. Я понял, ка это делается, но я не понял следующие вещи.

1. Какой смысл бегать по всему дереву в поисках нужного модуля? Процедура "проверил $tree[0]['company'], проверил есть ли вложенный.." мне кажется просто ненужной. Ну да ладно..

2. Как предать в скрипт несколько параметров? Например, company/news/2010/05/09/param1/param2/param3/ - получить новости за 9 мая 2010 с учетом параметров param1, param2, param3

3. Как быть с динамическим содержанием? Каталоги, вакансии, товары? Как отрабатывать запросы типа /catalog/12121.html ?
 

vovanium

Новичок
triumvirat
1. Почему по всему дереву, только по одной ветке. Я же описывал выше преимущества бегания по дереву.
еще например закрытые новости
company/private/news/
когда доходим до private проверяем если чел уже залогинился то идем дальше по пути и выводим закрытые новости, если нет то выдаем страницу авторизации.
аналогично может проверяться включены ли вышестоящие разделы, у меня еще проверяется время включение.

2. да все просто, модуль получает массив (2010, 05, 09, param1, param2, param3) а дальше уже делает с ним всё что считает нужным.

3. Какая разница, простой же принцип catalog нашли, 12121.html нет, следовательно передали 12121.html модулю который прописан для catalog.
 

Духовность™

Продвинутый новичок
vovanium
понятно. спасибо.

что меня тут смущает:

- в модуль вы отдаете необработанные данные - "12121.html", все-таки 12121 было бы лучшим ID-шником.

- нет явных имен REQUEST-переменных для параметров (2010, 05, 09, param1, param2, param3). Что, если мне нужно будет отдать в этот же модуль такой массив - (2010, 05, 09, param3) - как отличите param1 от param3?
 

vovanium

Новичок
triumvirat
в модуль вы отдаете необработанные данные
я просто как бы вообще не юзаю всяких приставок типа html, но в принципе какие проблемы обрабатывать, ты можешь спокойно обрезать .html и передать только число (при этом даже не лезть уже в дерево), это уже вопрос конкретной реализации.

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

да и в базу не делаются запросы с кусками url'ов, а выборка из базы идет только по id, не говоря о том что какой-то шутник может поиграться и передать что-то типа
/catalog/p1/p2/p3/p4/p5/p6/p7/p8/p9/p10/
и если ты будешь искать url'ы как описывал Adelf, то нужно будет сделать десяток запросов с поиском по тексту, прежде чем узнать что такой страницы вообще нет.

насчет request не въехал что ты хочешь получить в итоге
чтобы у тебя вместо $path[0] = 2010 было $path['year'] = 2010?
 

Духовность™

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

чтобы у тебя вместо $path[0] = 2010 было $path['year'] = 2010?
да. но это не проблема, можно регулярное выражение хранить а базе и применять его для последней "не найденной" части URLa.

-~{}~ 02.07.10 20:34:

vovanium
и ещё самое важное, мне не ясно. для urla вида /catalog/tv/ сработает модуль catalog, где будут выведены телевизоры - так? а для модуля /catalog/tv/123/ нужно использовать модуль "просмотр товара". Так ведь? Как в данном случае дать понять программе, что нужно подгрузить совершенно иной модуль?
 

HraKK

Мудак
Команда форума
Мои роутеры видно так и не посмотрел раз мучаешься)
 

Духовность™

Продвинутый новичок
HraKK
дык разбираться надо, на это времени нет. Ты бы нам теорию рассказал, мы бы тебе были благодарны)
 

vovanium

Новичок
это, я так понимаю, будет происходить непосредственно в контроллере? Вот это не нравится.
Я же говорю зависит от реализации, спокойно можешь обрезать, где больше нравится.

можно регулярное выражение хранить а базе и применять его для последней "не найденной" части URLa
А в скриптах их хранить уже не модно?
да и чесно говоря особой разницы между
$path[0] = 2010 и $path['year'] = 2010 я не вижу, ведь в любом случае нужно делать проверку переменной
напиши себе $year = $path[0] < 2000 ? date('Y') : (int)$path[0];
(2010, 05, 09, param3) - как отличите param1 от param3
такой вариант не устраивает (2010, 05, 09, '', '', param3)?

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

vovanium

Новичок
а для модуля /catalog/tv/123/ нужно использовать модуль "просмотр товара". Так ведь? Как в данном случае дать понять программе, что нужно подгрузить совершенно иной модуль?
Ну не знаю как у тебя, а у меня это не разные модули, и модуль каталог выводит либо список товаров, либо отдельный товар не вижу особого смысла их разделять.
 

Духовность™

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

vovanium

Новичок
triumvirat
Тут уже нужно смотреть, что ты там натворил :)
Ну к примеру если унифицированы имена, типа catalog_list, catalog_item, news_list, news_item, то можно в зависимости от наличия id подключаться *_item, если нет id то *_list.
 

Духовность™

Продвинутый новичок
vovanium
я попробовал ради интереса, реализовал эту схему, но вот как быть с 404 ошибкой?
при ошибочном запросе /catalog/p1/p2/p3/p4/p5/p6/p7/p8/p9/p10/ программа читает путь до самого последнего совпадения. В данном случае? например, откроется страница /catalog/ с параметрами в REQUEST
PHP:
Array
(
    [0] => p1
    [1] => p2
    [2] => p3
    [3] => p4
    [4] => p5
    [5] => p6
    [6] => p7
    [7] => p8
    [8] => p9
    [9] => p10
)
Далее, имея урл в дереве

/news/
/catalog/

при ошибочном запросе /catalog/lalalallla/news

соответственно твоему алгоритму будет открыта страница news по адресу /news/
 

HraKK

Мудак
Команда форума
и ещё самое важное, мне не ясно. для urla вида /catalog/tv/ сработает модуль catalog, где будут выведены телевизоры - так? а для модуля /catalog/tv/123/ нужно использовать модуль "просмотр товара". Так ведь? Как в данном случае дать понять программе, что нужно подгрузить совершенно иной модуль?
У меня есть понятие интерфейса Response. Контроллер имеющий этот интерфейс можно добавить в респонс объект. Оттуда вызывают по очереди все контролеры и в них передают реквест и слушают ответ.
Например в catalog передали /catalog/tv/123 то у меня вначале проверка идет
catalog это категория? если да то следуйщеее
tv это подкатегория категории если да то следующиее
123 это подкаталог tv если нет то проверяем это продук каталога tv? если да то возвращаем респонс true, и дальше управление переходит в этот контроллер. А в контроллере уже изменено внутренее состояние $this>Category и $this->Product
 
Сверху