Контроллеры (Controllers)
- Автор mityok on февраля 19th, 2008
Контроллеры являются сердцем вашего приложения, они определяют как будут обрабатываться HTTP-запросы.
Что такое контроллер?
Контроллер это файл с классом названый таким образом, чтобы его можно было привязать к URL.
Рассмотрим URL:
yoursite.com/index.php/blog
Для приведенного выше примера CodeIgniter попытается найти файл контроллера с именем blog.php и загрузить его.
Если имя контроллера совпадает с первым сегментом URI, контроллер будет загружен.
Первая попытка: Hello World!
Давайте создадим простой контроллер и проверим его в действии. При помощи текстового редактора создадим файл blog.php и поместим в него следующий исходный код:
<?php class Blog extends Controller { function index() { } } ?>
Сохраним файл в каталоге application/controllers.
Теперь откроем ваш сайт по адресу
yoursite.com/index.php/blog
Если все сделано верно, то вы увидите "Hello World!" в качестве ответа сервера.
Примечание: имена классов должны начинаться с заглавной буквы. Другими словами, этот пример правильный:
<?php class Blog extends Controller { } ?>
а этот не правильный:
<?php class blog extends Controller { } ?>
Также не забудьте, что ваш класс контроллер должен наследовать от класса-контроллера и наследовать все его функции.
Функции
В приведенном ниже примере имя функции контроллера - index. Функция контроллера "index" используется по умолчанию, если второй сегмент URL пуст. Пример адреса с указанием названия функции контроллера:
yoursite.com/index.php/blog/index
Второй сегмент URI определяет название функции контроллера, которая будет вызвана
Давайте попробуем реализовать новую функции в классе контроллера:
<?php class Blog extends Controller { function index() { } function comments() { } } ?>
Теперь откроем адрес
yoursite.com/index.php/blog/comments/
и увидим новое сообщение, которые мы задали в добавленной функции.
Передача сегментов URL в функцию
Если URL содержит более двух сегментов, они будут переданы в функцию контроллера в качестве параметров. К примеру, рассмотрим адрес:
your-site.com/index.php/products/shoes/sandals/123
3-й и 4-й сегменты URL будут переданы в функцию контроллера в качестве параметров:
<?php class Products extends Controller { function shoes($sandals, $id) { } } ?>
Примечание: если вы используете __маршрутизацию URI__, сегменты будут передаваться в функцию контроллера с учетом переадресации
Объявление контроллера по умолчанию
CodeIgniter позволяет вам задать, какой контроллер будет использоваться по умолчанию если контроллер не задан в URI. Для этого необходимо в файле application/config/routes.php указать значение параметра 'default_controller', например:
$route['default_controller'] = 'Blog';
В приведеном выше примере Blog - имя класса контроллера, который будет использоваться по умолчанию. Если вы вызовите основной файл index.php не задав какой-либо сегмент URI, вы увидите сообщение 'Hello World!', выведенное контроллером Blog.
Переназначение вызовов функций
Как уже было сказано выше, второй сегмент 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(); } }
Обработка вывода
В состав CodeIgniter включен класс, который отвечает за отправку окончательно обработанных данных веб-браузеру. Более детально этот класс будет рассмотрен в главах __Представления(Views)__ и __Класс Output__. В то же время в некоторых случаях вам может понадобиться дополнительная обработка (пост-процессинг) выводимых данных и отправка их браузеру самостоятельно. CodeIgniter позволяет добавить в контроллер метод _output() которая будет получать окончательные данные для вывода браузеру. Вот простейший пример:
function _output($output) { }
Примечание: функция _output() получает данные для вывода в окончательном виде. Анализ производительности и использования памяти уже произведен, файлы кеша записаны (если вы используете кеш), заголовки отправлены (если вы используете эту функциональность). Если вы используете встроенные функции анализа производительности и использования памяти, то их результаты могут быть неточны. Существует альтернативный способ обработки вывода до того, как произведена окончательная обработка. Детально этот вопрос рассмотрен в главе __Класс Output__.
Приватные (скрытые) функции
В некоторых случаях вам может понадобиться скрыть часть функций от публичного доступа. Чтобы сделать функцию приватной, просто добавьте символ подчеркивания "_" в начале имени функции и она не будет вызываться по запросу через URL. К примеру, если вы объявите в своем кнтроллере функцию следующего вида:
function _utility() { // some code }
то вызов URL your-site.com/index.php/blog/_utility/ работать не будет.
Размещение контроллеров в подкаталогах
Если вы разрабатываете большое по объему приложение вам может понадобиться сгруппировать контроллеры в подкаталоги. CodeIgniter позволяет это сделать. Просто создайте подкаталог в каталоге application/controllers и разместите в нем свои классы контроллеры.
Примечание: при использовании этой функциональности первый сегмент URI указывает на подкаталог. К примеру, если ваш контроллер расположен по следующему пути:
application/controllers/products/shoes.php
то для его вызова понадобится запрос следующего вида:
your-site.com/index.php/products/shoes/123
Каждый из подкаталогов может содержать контроллер по умолчанию, который будет вызван если URL содержит только название подкаталога. Для этого просто нужно поместить контроллер названый в соотвествии с настройками в application/config/routes.php
Кроме того, CodeIgniter позволяет переназначить URL при помощи __маршрутизации URL__.
Конструкторы классов
Если вам понадобилось использовать конструктор в каком-либо из своих контроллеров, вам придется обязательно написать в нем следующий код:
parent::Controller();
Примечание переводчика: данная строка должна быть первой в коде конструктора либо находиться выше любого обращения к функциям CodeIgniter.
Эта строка кода является обязательной, т.к. ваш локальный конструктор перекрывает конструктор класса предка, и приходится вручную вызывать его.
Если вам не известно понятие конструктора, в PHP 4 конструктор - это просто функция, которая называется точно так же, как и класс. Пример:
<?php class Blog extends Controller { function Blog() { parent::Controller(); } } ?>
В PHP 5 констрктор объявляется при помощи следующего синтаксиса:
<?php class Blog extends Controller { function __construct() { parent::Controller(); } } ?>
Конструкторы нужны, если вы хотите задать значения по умолчанию для свойств объекта, а также выполнить определенные действия при создании экземпляра класса. Конструкторы не могут возвращать значение, но могут выполнять код, необходимый для инициализации.
Примечание переводчика: конструктор - метод класса который автоматически вызывается при создании экземпляра класса (объекта).
Зарезервированные имена
Поскольку ваш класс контроллера будет дочерним классом основного контроллера приложения, вам нельзя называть методы своего класса так же, как и методы класса предка, иначе методы класса предка будут переопределены. Вот список зарезервированных имен функций, которые нельзя использовать:
- Controller
- CI_Base
- _ci_initialize
- _ci_scaffolding
Если вы используете PHP 4, то есть также ряд других зарезервированных имен методов:
- CI_Loader
- config
- database
- dbutil
- dbforge
- file
- helper
- helpers
- language
- library
- model
- plugin
- plugins
- scaffolding
- script
- view
- vars
- _ci_assign_to_models
- _ci_autoloader
- _ci_init_class
- _ci_init_scaffolding
- _ci_is_instance
- _ci_load
- _ci_load_class
- _ci_object_to_array
В целом это все, что вам необходимо знать о контроллерах для начала.

Отправить комментарий