CodeIgniter User Guide Version 2.0.0


Контроллеры

Контроллеры — это сердце вашего приложения, так как именно они определяют, как должны обрабатываться запросы HTTP.

Что такое контроллер?

Контроллер — это просто файл класса, который называется так, чтобы ассоциироваться с URI.

Рассмотрим этот URI:

example.com/index.php/blog/

В этом примере CodeIgniter будет пытаться найти контроллер с названием blog.php и загрузить его.

Когда имя контроллера совпадает с первым сегментом URI, он будет загружен.

Давайте попробуем:  Hello World!

Давайте создадим простейший контроллер, который вы сможете увидеть в действии. Используя текстовый редактор, создайте файл blog.php и разместите в нем следующий код:

Затем сохраните этот файл в вашу директорию application/controllers/.

Теперь посетите ваш сайт, используя URL, соответствующий этому:

example.com/index.php/blog/

Если вы сделали все правильно, вы должны увидеть Hello World!.

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

<?php
class Blog extends CI_Controller {

}
?>

А это не правильно:

<?php
class blog extends CI_Controller {

}
?>

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

Функции

В примере выше имя функции — index(). "Индексные" функции всегда загружаются по умолчанию, если второй сегмент URI пуст. Другой способ показать ваше сообщение "Hello World" может быть таким:

example.com/index.php/blog/index/

Второй сегмент URI определяет, какая функция контроллера будет вызвана.

Давайте попробуем. Добавьте новую функцию в ваш контроллер:

Теперь загрузите следующий URL, чтобы увидеть функцию comment:

example.com/index.php/blog/comments/

Вы увидите ваше новое сообщение.

Передача сегментов URI в ваши функции

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

Например, давайте предположим, что у вас есть URI вроде этого:

example.com/index.php/products/shoes/sandals/123

Вашей функции будут переданы третий и четвертый сегменты URI ("sandals" and "123"):

<?php
class Products extends CI_Controller {

    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

Важно:  Если вы используете URI Роутинг, сегменты, передаваемые в ваши функции, будут также перезаписаны.

Определение контроллера по умолчанию

CodeIgniter может загружать контроллер по умолчанию в случае, если не представлено URI, к примеру, если передан только URL вашего сайта. Для того, чтобы указать контроллер по умолчанию, откройте ваш файл application/config/routes.php и установите эту переменную:

$route['default_controller'] = 'Blog';

Где Blog — это имя класса контроллера, который вы хотите использовать. Если вы теперь загрузите ваш основной файл index.php без указания сегментов URI, вы увидите действие контроллера по умолчанию.

Ремаппинг вызовов функций

Как сказано выше, второй сегмент URI обычно определяет, какая функция контроллера будет вызвана. CodeIgniter позволяет вам переписать это поведение, посредством функции _remap():

function _remap()
{
    // Some code here...
}

Важно:  Если ваш контроллер содержит функцию с именем _remap(), она будет вызываться всегда вне зависимости от того, что содержит URI. Она изменяет нормальное поведение, при котором URI определяет, какие функции будут вызваны, позволяя вам определять собственные правила роутинга.

Для того, чтобы переписать вызов функции обычно второй сегмент URI будет передан как параметр в функцию _remap():

function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

Любые дополнительные сегменты после имени метода будут переданы в _remap(), как опциональный второй параметр. Этот массив может быть использован вместе с функцией PHP call_user_func_array для эмуляции поведения по умолчанию CodeIgniter.

function _remap($method, $params = array())
{
    $method = 'process_'.$method;
    if (method_exists($this, $method)
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

Контроль вывода

CodeIgniter имеет класс Output, который автоматически заботится об отправке заключительных данных в браузер. Больше информации по этому вопросу вы можете найти в разделе Отображения и класс Output. В некоторых случаях, вы можете предварительно обрабатывать финализированные данные перед отправкой в браузер. CodeIgniter позволяет вам добавить функцию с названием _output() в ваш контроллер, который будет принимать и отправлять финализированные данные.

Важно:  Если ваш контроллер содержит функцию с именем _output(), она будет всегда вызываться классом output вместо вывода финализированных данных напрямую в браузер. Первый параметр функции будет содержать финализированный вывод.

Вот пример:

function _output($output)
{
    echo $output;
}

Пожалуйста, обратите внимание, что ваша функция _output() получит данные в финализированном состоянии. Данные тестирования и использования памяти будут отрендерены, файлы кеша записаны (если вы используете кеширование), и заголовки будут отправлены (если вы используете класс Output) перед тем, как вывод будет захвачен функцией _output().

Для того, чтобы вывод контроллера кешировался, его метод _output() должен использовать:
if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}
Если при этой опции вы используете таймер выполнения и статистику использования памяти, данные могут быть некорректны. Смотрите альтернативные способы контролирования вывода до завершения любого процессинга здесь.

Приватные функции

В некоторых случаях вы, возможно, захотите спрятать некоторые функции от публичного доступа. Для того, чтобы сделать функцию приватной, просто добавьте прочерк перед именем — как префикс, и она больше не будет доступна через запрос URI. Например, вы можете скрыть функцию так:

function _utility()
{
  // some code
}

Попытка доступа через URL, вроде этой, не будет работать:

example.com/index.php/blog/_utility/

Организация контроллеров в поддиректориях

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

Просто создайте директории внутри вашей application/controllers и поместите ваши контроллеры внутри них.

Примечание:  При использовании этой опции первый сегмент вашего URI должен указывать на директорию. Например, давайте скажем, что контроллер находится тут:

application/controllers/products/shoes.php

Для того, чтобы вызвать этот контроллер, ваш URI должен выглядеть примерно так:

example.com/index.php/products/shoes/show/123

Каждая из ваших поддиректорий может содержать контроллер по умолчанию, который будет вызван, если URL указывает только на поддиректорию. Просто укажите ваш контроллер по умолчанию в файле application/config/routes.php

CodeIgniter также позволяет вам переписывать ваши URI, используя URI Роутинг.

Конструкторы классов

Если вы хотите использовать конструктор в любом из ваших контроллеров, вы должны разместить в нем следующую строку кода:

parent::__construct();

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

<?php
class Blog extends CI_Controller {

       function __construct()
       {
            parent::__construct();
            // Your own constructor code
       }
}
?>

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

Зарезервированные имена функций

Поскольку классы ваших контроллеров будут расширять основное приложение, вы должны иметь некоторую осторожность в именовании собственных функций, чтобы не допускать конфликтов имен. Смотрите полный список на странице Зарезервированные имена.