CodeIgniter, руководство пользователя к версии 1.6.1


Контроллеры

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

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

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

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

www.your-site.com/index.php/blog/

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

Когда имя контроллера будет найдено в первом сегменте URL — он будет загружен.

Попробуем вывести:  Hello World!

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

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

Теперь зайдите на ваш сайт, используя примерно такой адрес:

www.your-site.com/index.php/blog/

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

Замечание: Имена классов должны начинаться с прописных букв. Проще говоря вот правильное название:

<?php
class Blog extends Controller {

}
?>

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

<?php
class blog extends Controller {

}
?>

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

Функции

В приведенном выше примере функция называется index(). Функция с названием «index» всегда будет загружаться по умолчанию, если второй сегмент в URL не определен. Еще один способ просмотреть ваше сообщение «Hello World» — обратиться по этому адресу:

www.your-site.com/index.php/blog/index/

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

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

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

www.your-site.com/index.php/blog/comments/

Вы должны увидеть новое сообщение.

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

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

Например, можно вызвать такой адрес:

www.your-site.com/index.php/products/shoes/sandals/123

Ваша функция получит 3 и 4 сегменты в URL («sandals» and «123»):

<?php
class Products extends Controller {

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

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

Объявление контроллера по умолчанию

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

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

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

Переадресация вызова функции

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

function _remap()
{
    // Здесь любой код...
}

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

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

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

Результат обработки

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

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

Вот пример:

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

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

Защищенные функции

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

function _utility()
{
  // какой-то код
}

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

www.your-site.com/index.php/blog/_utility/

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

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

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

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

application/controllers/products/shoes.php

URI для вызова этого контроллера будет выглядеть так:

www.your-site.com/index.php/products/shoes/123

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

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

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

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

parent::Controller();

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

Если вы не знакомы с конструктором, то в PHP 4 конструктор — это просто функция, название которой совпадает с названием класса:

<?php
class Blog extends Controller {

       function Blog()
       {
            parent::Controller();
       }
}
?>

В PHP 5 конструктор использует следующий синтаксис:

<?php
class Blog extends Controller {

       function __construct()
       {
            parent::Controller();
       }
}
?>

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

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

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


Если вы работаете с PHP 4, то количество таких названий заметно увеличивается. Имена перечисленные ниже нельзя использовать ТОЛЬКО в том случае, если вы работаете с PHP 4.

Вот и все!

Вот, в двух словах, и все, что вам надо знать о контроллерах.