Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

# CodeIgniter User Guide Version 2.1.3

Search User Guide

# Контроллеры

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

- Что такое контроллер?
- Hello World
- Функции
- Передача сегментов URI к вашим функциям
- Определение контроллера по умолчанию
- Ремаппинг вызовов функций
- Управление выводом
- Приватные функции
- Организация контроллеров в поддиректориях
- Конструкторы классов
- Зарезервированные имена функций

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

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

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

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

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

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

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

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

<?php class Blog extends CI_Controller { public function index() { echo 'Hello World!'; } }

Затем сохраните файл в вашу директорию 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 определяет, какая функция контроллера будет вызвана.

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

<?php class Blog extends CI_Controller { public function index() { echo 'Hello World!'; } public function comments() { echo 'Look at this!'; } }

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

`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 {
public function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}`

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

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

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

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

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

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

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

`public function _remap()
{
// Какой-то код...
}`

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

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

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

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

`public 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. В некоторых случаях, однако, вы можете делать пост-обработку финализированных данных, и отправлять их в браузер самостоятельно. CodeIgniter предоставляет вам функцию, называемую _output() для вашего контроллера, которая будет получать финализированные данные для вывода.

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

Вот пример:

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

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

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

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

`private 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 {
public function `__construct()`
{
parent::__construct();
// Your own constructor code
}
}
?>`

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

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

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

## Вот и все!

В общем, это все, что нужно знать о контроллерах.

### Поделиться

Переведено в компании Аринт.

# Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

## Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter