Spec-Zone.ru › CodeIgniter 3

Контроллеры

Контроллеры — это сердце вашего приложения, так как они определяют, как должны обрабатываться запросы 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/.

Важно

Файл должен называться ‘Blog.php’, с большой буквой «Б».

Теперь посетите ваш сайт, используя 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 отсутствует, как это будет в случае, когда запрашивается только корневой URL вашего сайта. Чтобы указать контроллер по умолчанию, откройте файл application/config/routes.php и установите эту переменную:

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

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

Для получения дополнительной информации см. раздел «Зарезервированные маршруты» в документации маршрутизации URI.

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

Как отмечалось выше, второй сегмент 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.

Пример:

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 содержит только подкаталог. Просто поместите туда контроллер, который соответствует имени вашего «default_controller», указанному в файле application/config/routes.php.

CodeIgniter также позволяет переназначать ваши URI с помощью функции маршрутизации URI.

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

Если вы планируете использовать конструктор в любом из ваших контроллеров, ОБЯЗАТЕЛЬНО добавьте следующую строку кода в него:

parent::__construct();

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

Пример:

<?php
class Blog extends CI_Controller {

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

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

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

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

Важно

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

И всё!

Вот, вкратце, всё, что нужно знать о контроллерах.

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/general/controllers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API