CodeIgniter: обращение к функциям с сегментом URL

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

1) Новый опросник не имеет предварительной информации

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

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

($ surveyID – целое число опроса, которое требуется)

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

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

function index () {

$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, он думает, что я загружаю метод в контроллер.

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

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

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

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

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

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

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

в

mydomain.com/survey/

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

Сеансы должны управляться с использованием куки-файлов или класса сеанса 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 – идентификатор сеанса и идентификатор гостя, соответственно. Лично я бы сказал, что это плохая форма. Семантический смысл ваших сегментов ломается: становится трудно определить, что означает этот первый числовой сегмент (это идентификатор опроса или идентификатор сеанса), если вы не можете всегда гарантировать, что эти маршруты на месте.