Можно ли вызвать вызываемый контроллер по умолчанию, если вызываемый контроллер не существует? - PullRequest
0 голосов
/ 27 октября 2010

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

В настоящее время сайт тиражируется для его пользователей и представляетперсонализированные данные, основанные на URL, например, Джо может иметь свой сайт по адресу:

www.example.com/joe
www.example.com/joe/random-page.php

И вы замените «Джо» на любое имя пользователя.URL-адреса должны быть структурированы следующим образом: / joe / isnt FOR joe, это для посетителей joe, поэтому я не могу полагаться на логин пользователя или метод такого рода.Я мог бы переключиться на joe.example.com, но предпочел бы нет.

Есть ли способ сделать эту игру приятной с помощью Code Igniter?

В настоящее время он хотел бы вызвать контроллер joe.Моя первоначальная мысль - попытаться найти способ вызова контроллера по умолчанию, когда контроллер не существует, но если у некоторых профессионалов по КИ есть советы относительно другого, лучшего способа справиться с этим, было бы здорово.

Ответы [ 3 ]

1 голос
/ 27 октября 2010

Я продолжал читать документы по КИ после публикации Алекса и нашел информацию в файле rout.php , который делает именно то, что мне нужно.

Он позволяет вам использовать регулярные выражения для перезаписимаршруты (URL-адреса), почти так же, как mod_rewrite, поэтому я могу удалить имя пользователя и в конечном итоге передать его в качестве параметра.

1 голос
/ 27 октября 2010

Обновите до CodeIgniter 2.0 и используйте $ route ['404_override'] = 'controller';или установите Модульные Расширения, которые делают то же самое, но пока они используют вместо этого $ route ['404'].

1 голос
/ 27 октября 2010

Есть несколько способов сделать это.Только предупредите, что оба эти решения требуют, чтобы вы редактировали основные файлы 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 есть решение для этого.

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