Есть несколько способов сделать это.Только предупредите, что оба эти решения требуют, чтобы вы редактировали основные файлы CI.Это означает, что вы не можете обновить без нарушения этих правок.К сожалению, хуки не решают эту проблему соответствующим образом.
Простой способ:
строка 188-195 в system / vodeigniter / CodeIgniter.php обрабатывает логику того, что происходит, когдаконтроллер не найден.
Сложнее, но лучше:
Есть крюк (http://codeigniter.com/user_guide/general/hooks.html)
pre_controller
Но это не сработает! Причина в том, что он вызывается после того, как контроллер определен, но до того, как что-то действительно выполнено. Другими словами, уже слишком поздно.следующий более ранний
pre_system
на самом деле слишком рано, потому что маршрутизация не была выполнена и все, что вы делаете, будет перезаписано.
Поэтому мне нужно, чтобы первый контроллер выглядел одинаково, но в итоге вызывал другой контроллер.Причиной было то, что к странице обращались иерархическим образом, так что это было бы подразделом подраздела и т. Д.
Что я сделал, так это добавилne 43 из system / library / Controller.php
$this->_ci_initialize();
В основном у меня была автозагрузка библиотек ДО вызова контроллера, потому что я обнаружил, что библиотеки не были загружены до вызова контроллера, и мне нужно былоэто нужно сделать, потому что мне нужно было проверить аутентификацию доступа пользователя и подключиться непосредственно к самой маршрутизации.
После этого я расширил одну из базовых библиотек ядра, которые были автоматически загружены (в данном случае сеанс дляприменение конкретных причин), а затем выполнено изменение маршрута.
$RTR = & load_class( 'Router' );
$this->URI = & load_class( 'URI' );
$this->URI->_fetch_uri_string();
Я назвал этот код в начале, а затем включил свою логику.Это пример того, как выглядит моя логика перенаправления
if ( $this->segment( 1 ) == 'institute' )
{
if ( ! in_array( $this->segment( 3 ), $course ) )
{
$RTR->set_class( 'courseClass' );
$RTR->set_method( 'index' );
if ( ! $this->segment( 4 ) )
{
$RTR->set_class( 'course' );
$RTR->set_method( 'index' );
}
else
{
$RTR->set_class( 'course' );
$RTR->set_method( $this->segment( 3 ) );
}
}
Оригинал намного длиннее.Я, вероятно, должен рассмотреть вопрос о написании какого-либо плагина или превосходного способа обработки переписывания, а не глупой логики спагетти.Тем не менее, мне нужен был очень точный контроль зерна вызываемых контроллеров на основе URL.Это буквально даст вам режим контроля бога над вашим контроллером на основе URL-адресов.Это взломать?Да.Это не элегантно?Абсолютно.Но мне нужно было это сделать.
Просто запомните, так как это редактирует основные файлы, вы не можете легко обновить после.Я думаю, что у структуры Kohana есть решение для этого.