Статьи

CodeIgniter 3 | Controllers: Code Examples

  1. Що таке контролер?
  2. Спробуємо: Hello World!
  3. методи
  4. Передача сегментів URI вашим методам
  5. Визначення контролера за замовчуванням
  6. Виклик методу переадресації
  7. результат обробки
  8. Приватні методи
  9. Організація ваших контролерів в підкаталогах
  10. конструктори класів
  11. Імена зарезервованих методів
  12. Це воно!

Контролери є основою вашого застосування, оскільки вони визначають, як обробляти HTTP-запити.

зміст сторінки

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

Контролер - це просто файл класу, який вказаний таким чином, який може бути пов'язаний з 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 / controllerlers /.

важливий

Файл повинен бути названий «Blog.php» з капіталом «B».

Тепер відвідайте свій сайт, використовуючи URL-адресу, схожий на цей:

example.com/index.php/blog/

Якщо ви зробили це правильно, ви повинні побачити:

Привіт світ!

важливий

Імена класів повинні починатися з літери верхнього регістру.

Це дійсно:

<? 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-адресу, щоб побачити метод коментарів:

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

Ви повинні побачити своє нове повідомлення.

Передача сегментів URI вашим методам

Якщо ваш URI містить більше двох сегментів, вони будуть передані вашій методу в якості параметрів.

Наприклад, припустимо, у вас є URI:

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

Ваш метод буде переданий сегментам URI 3 і 4 ( «сандалі» і «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';

Де «блог» - це ім'я класу контролера, який ви хочете використовувати. Якщо ви завантажте основний файл 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 () як необов'язковий другий параметр. Цей масив може використовуватися в поєднанні з call_user_func_array () PHP для емуляції поведінки за замовчуванням 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 має клас виведення, який автоматично відправляє ваші остаточні візуалізовані дані в веб-браузер. Більш детальну інформацію про це можна знайти на сторінках класів Views і Output . Однак в деяких випадках ви можете якимось чином обробити завершення дані і відправити їх в браузер самостійно. CodeIgniter дозволяє додати до контролера метод з ім'ям _output (), який отримає остаточні вихідні дані.

важливий

Якщо ваш контролер містить метод з ім'ям _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 дозволяє це зробити.

Просто створіть підкаталоги під основним додатком / контролерами / один і помістіть в них класи контролерів.

замітка

При використанні цієї функції перший сегмент вашого 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.

Це воно!

Це, загалом, все, що потрібно знати про контролерах.

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

Новости