CodeIgniter: Направление на функции с сегментом URL - PullRequest
1 голос
/ 10 июля 2009

Я работаю над системой опроса для моей компании, и я настроил ее так, чтобы было два способа пройти опрос.

1) New Survey Taker нет предварительной информации

2) Опрос уже отправлен, и сеанс создан.

В случае, если бы я хотел, чтобы мой URL выглядел следующим образом:
mydomain.com/SurveySystem/index.php/survey/$surveyID

($ surveyID - целое число в опросе)

Во втором случае мы создадим ссылку для тестируемого. Мне бы хотелось, чтобы URL выглядел так:
mydomain.com/SurveySystem/index.php/survey/$surveySessionID/$guestID

В моем классе Survey я настроил его следующим образом:

индекс функции () {

$segments = $this->uri->total_segments();

if($segments == 1){
   echo "no surveyID set";
   return;
}

if($segments == 2){
    $this->take_survey($this->uri->segment(2));
}

if($segments == 3){
    $this->survey_session($this->uri->segment(3), $this->uri->segment(4));
}

}

Когда информация не передается, она прекрасно воспроизводится. Но если я попытаюсь поместить целое число в поле surveyID, оно будет думать, что я загружаю метод в контроллер.

Спасибо за помощь!

Ответы [ 2 ]

7 голосов
/ 10 июля 2009

Используйте URI-маршрутизацию , чтобы переопределить отображение контроллера / функции / аргументов по умолчанию.

Пример: в вашем application/config/routes.php:

$route['survey/:num'] = "survey/take_suvey";

Бонус: Вы также можете удалить часть index.php/, см. Удаление файла index.php .

2 голосов
/ 30 июня 2010

Мой вопрос с недружелюбным URL-адресом, почему вам все равно, как он выглядит? Это не семантика с точки зрения пользователя. Да, вы должны удалить index.php. В связи с переписыванием URL все это должно быть уменьшено с:

mydomain.com/SurveySystem/index.php/survey/????

до

mydomain.com/survey/

И ваши методы класса CI могут быть сокращены до «взять» или «отправить» и последующего «просмотра».

Сеансы должны управляться с использованием файлов cookie или класса сеансов CI. Если вам нужно отслеживать состояние в URI, объедините свой «сеанс» и «guestID» для конкретного опроса в один сегмент с кодировкой base64.

Наконец, используя предложенный маршрут, приложение не сможет узнать, какой идентификатор опроса загрузить. Это должно было бы захватить ": num" и передать его take_survey:

$route['survey/(:num)'] = "survey/take_survey/$1";

Если вы берете числовые идентификаторы в качестве первого сегмента после / обследования, вам нужен другой маршрут, размещенный после этого, для обработки случая, когда этот сегмент является идентификатором сеанса:

$route['survey/(:num)/(:num)'] = "survey/session_manager/$1/$2";

Где $ 1 и $ 2 - это идентификатор сессии и идентификатор гостя соответственно. Лично я бы сказал, что это плохая форма. Семантическое значение ваших сегментов нарушается: становится трудно определить, что означает этот первый числовой сегмент (идентификатор опроса или идентификатор сеанса), если вы не всегда можете гарантировать, что эти маршруты на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...