Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор $_GET, На контроллер, действие, параметры 
:(
    Опции темы
eee
Дата 16.10.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 14.4.2008
Где: ХарьковCity

Репутация: нет
Всего: 1



Вечер добрый, обращаюсь за помощью в разборе GET-запроса. Но об этом кричит заголовок, поэтому:

Нужно разобрать QUERY_STRING, в ней есть route. Есть еще rewrite-правило "RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]". 
Разобрав route я получаю имя вызываемого контроллера и действия. 
А теперь внимание, вопрос:
Подскажите, пожалуйста, как из этой строки запроса выхватить другие параметры, что бы потом передать их действию. 
Т. е., например:
Код

// вот тот самый контроллер
class ControllerArticle extends ControllerBase {
// и действие
    public function actionView($id = FALSE) {
        echo (FALSE !== $id) 
                 ? 'All articles in category' 
                 : 'One article with ID = ' . $id;
    }
}


Распарсить один параметр не составляет труда, а если больше?
Код

// коварное действие
    public function actionCategory($id, $page = FALSE) {
        echo (FALSE !== $page) 
                 ? 'First page of category with ID = '  . $id
                 : $page . ' page of category with ID = ' . $id;
    }


Как поступить в таком случае? Сам роутер выглядит так:
Код

// разбор запроса, пока умеет узнавать только один аргумент
       $this->getController($file, $controller, $action, $args);
        
        $controllerFile = $this->controllersPath . $controller . '.php';
        if (!is_readable($controllerFile))
            throw new RouterException('Invalid controller file (' . $controllerFile . ')', __METHOD__, __FILE__, __LINE__);
        include_once($controllerFile);
        
        $controllerClass = 'Controller' . ucfirst($controller);
        $action          = 'action' . ucfirst($action);
        
        $controller = new $controllerClass($this->registry);      
        if (!is_callable(array($controller, $action)))
            throw new RouterException('Invalid controller or/and action (' . $controllerClass . '::' . $action . ')', __METHOD__, __FILE__, __LINE__);
        if (null !== $args)
            $controller->$action($args);
        else 
            $controller->$action();


Строка запроса выглядит так: http://example.com/controller/action/param1/..../paramN

Надеюсь на вашу помощь, как распарсить, а именно, как передать действию все имеющиеся в запросе параметры. 

Это сообщение отредактировал(а) eee - 16.10.2009, 01:15
PM MAIL WWW ICQ   Вверх
brother79
Дата 16.10.2009, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 18.8.2009

Репутация: 2
Всего: 6



Ну прежде всего - что за контроллер - наверно какой-то фреймворк, там есть свои возможности.
2) ничего не мещает в RewriteRule задать более сложное правило на регулярке, чтобы твои параметры передавались как-то отдельно
3) на php есть замечательная ф-я explode, с её помощью как раз распарсить данный вормат - труда не составляет


--------------------
PM MAIL WWW   Вверх
Ипатьев
Дата 16.10.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



не, не фреймворк.
это он сам, по ходу, так пишет

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

причем, как я понял, параметры у него не именованные.
поэтому узнать, есть та id, или нету - действительно, проблематично

при чем здесь GET-запрос и QUERY_STRING - тоже непонятно.
поскольку в них и так всегда лежит ровно один параметр, и разбирать там нечего. 


Это сообщение отредактировал(а) Ипатьев - 16.10.2009, 10:47
PM MAIL   Вверх
brother79
Дата 16.10.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 471
Регистрация: 18.8.2009

Репутация: 2
Всего: 6



Цитата(Ипатьев @  16.10.2009,  10:39 Найти цитируемый пост)
при чем здесь GET-запрос и QUERY_STRING - тоже непонятно.
поскольку в них и так всегда лежит ровно один параметр, и разбирать там нечего. 


мне проект приходилось доделывать, там так и происходит перётся строка исходная, запихивается параметром в какойнь-дь index.php и разбирается у же в нём на кирпичики, типа своебразный роутинг универсальный. Метод правда жутко извращённый изврашённый, но работает, хотя я бы лучше вызываемый модуль и action в htaccess извлёк, а параметры - уже можно и так передать.



--------------------
PM MAIL WWW   Вверх
Ипатьев
Дата 16.10.2009, 13:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



а что извращенного-то?
при добавлении нового модуля в систему каждый раз .htaccess править лучше? 

Это сообщение отредактировал(а) Ипатьев - 16.10.2009, 13:16
PM MAIL   Вверх
eee
Дата 16.10.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 14.4.2008
Где: ХарьковCity

Репутация: нет
Всего: 1



Эмм, ну во-первых, спасибо что откликнулись. А теперь пошагово.

Цитата(brother79)

Ну прежде всего - что за контроллер - наверно какой-то фреймворк, там есть свои возможности.
2) ничего не мещает в RewriteRule задать более сложное правило на регулярке, чтобы твои параметры передавались как-то отдельно
3) на php есть замечательная ф-я explode, с её помощью как раз распарсить данный вормат - труда не составляет 

Нет, это не фреймворк - как верно предположил Ипатьев, это я сам так пишу). 
Я был бы очень признателен за пример подобного rewrite-правила.
Распарсить труда и так не составляет, ступор наступает в момент передачи параметров действию. Изначально (пока не дошел до реализации) предполагал, что $this->getController($file, $controller, $action, $args); будет заносить в array $args все параметры найденные в строке запроса. Т.е. в случае http://example.com/controller/action/param1/..../paramN:
Код

array[0] => param1
array[1] => param2
array[2] => param3
...
array[n] => paramN

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

Цитата(Ипатьев)

при чем здесь GET-запрос и QUERY_STRING - тоже непонятно.
поскольку в них и так всегда лежит ровно один параметр, и разбирать там нечего. 

Да, извините, это я Вас запутал. Здесь участвует только $_GET['route']. Вот его содержимое и разбивается.

Проблема еще актуальна. Все еще прошу помочь(.
PM MAIL WWW ICQ   Вверх
Ипатьев
Дата 16.10.2009, 16:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



"я все сделал, но жду более логичное" - это не актуальная проблема, а, извините, мозго%#$^@.

Добавлено через 5 минут и 22 секунды
Цитата(eee @  16.10.2009,  16:31 Найти цитируемый пост)
Да, извините, это я Вас запутал.

На самом деле не нас, а себя.
И вот это, насколько я могу судить - как раз актуальная проблема. Вы не очень понимаете сами, чего хотите. А без этого двигаться куда-либо бессмысленно.

И снова о необходимости алгоритмов пхп-программисту.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0793 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.