Контроллеры

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

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

Котнроллер - простой класс файла названный путем ассоции с URI.

Рассмотрим данный URI:

example.com/index.php/blog/

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

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

Попробуем сделать: Hello World!

Попробуем сделать простой контроллер чтобы увидеть его в действии. В текстовом редакторе, создайте файл с именем Blog.php, и запишите в него код:

<?php
class Blog extends CI_Controller {

	public function index()
	{
                echo 'Hello World!';
	}
}

Сохраниет файл в application/controllers/ папку.

Важно

Имя файла ‘Blog.php’, должно начинаться с заглавной ‘B’.

Теперь посетите свой сайт используя URL похожий на этот:

example.com/index.php/blog/

Если все сделано правильно, Вы увидите:

Hello World!

Важно

Имя класса должно начинаться с заглавной буквы.

Так правильно:

<?php
class Blog extends CI_Controller {

}

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

<?php
class blog extends CI_Controller {

}

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

Методы

В примере выше имя метода - index(). “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 чтобы увидеть метод comment:

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

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

Передача URI сегментов Методам

Если URI содержит более двух сугментов, то они будут переданы Методу как параметры.

Например, предположим есть URI как этот:

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

Метод получит URI сегменты 3 и 4 (“sandals” и “123”):

<?php
class Products extends CI_Controller {

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

Важно

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

Назначение контроллера по умолчанию

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

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

Тут, Blog имя класса контроллера который будет использован. Теперь будет загружаться наш главный index.php без дополнительных URI сегментов, где находиться наше Hello World сообщение, по умолчанию.

Распределение вызовов Методов

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

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

Важно

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

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

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

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

Example:

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

Важно

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

Вот пример:

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

Примечание

Учтите, _output() метод получает данные когда они в подготовленном для вывода состоянии. Контроль и использование памяти для данных будет предоставлять, кеш файлов (если активировано кеширование), а заголовки будут отправлены (если используется это свойство) прежде чем передадутся в _output() метод. Чтобы контроллер выводил кеш правильно, используйте _output() метод так:

if ($this->output->cache_expiration > 0)
{
	$this->output->_write_cache($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();

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

Example:

<?php
class Blog extends CI_Controller {

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

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

Зарезервированные имена методов

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

Важно

Также не следует называть методы как класс. Если назвали, и в нем нет __construct() метода в том же классе, получите Index::index() метод который будет выполнен как конструктор класса! Свойство PHP4 обратной совместимости.

Вот и все!

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