Переход к официальным ресурсам:      Codeigniter4 / Документация / Github / Форум / CodeIgniter3
Привет! В настоящий момент я временно прекратил перевод документации по причине того, что она она содержит целый ряд неточностей, а также еще дорабатывается со стороны разработчиков. Если ты заинтересован в изучении фреймворка CodeIgniter 4, то приглашаю тебя на свой канал на YouTube (Перейти на канал), где я более подробно выкладываю занятия по данному фреймворку.


Первые статические страницы

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

Сначала мы создадим простые статические страницы, чтобы познакомиться с Контроллерами и Представлениями на живом примере. Далее, мы подключим базу данных, чтобы получать из неё информацию и проведем первое знакомство с Моделями. В завершающем уроке мы сможем сами наполнять нашу базу данных, создав специальную форму для добавления новостей.

Основные цели данного учебника:

  • Познакомить тебя с шаблоном проектирования MVC;
  • Рассказать тебе об основах маршрутизации;
  • Показать пример работы с формами;
  • Показать основы построения запросов к базе данных, используя Query Builder.
 

Итак, поехали!

Статические страницы

Первое, что тебе потребуется сделать, это создать свой первый контроллер, который будет обрабатывать полученные запросы и отображать различные страницы, в зависимости от того, что было выбрано. Однако, прежде всего, тебе нужно здесь и сейчас очень четко понять "основы основ". Читай этот раздел столько раз, сколько потребуется и до тех пор, пока ты не вызубришь эти вещи до автоматизма. На чётком понимании нижеследующей информации строится вся работа!

Смотри, наверняка ты видел на различных сайтах ссылки, примерно такого вида:

http://example.com/news/latest/10

Так вот, в примере выше news - это контроллер, который будет вызван, latest - это метод (или функция) внутри этого контроллера, которая начнет работу, а 10 - это значение, которое будет передано в этот метод для дальнейшей работы. Запишем предыдущий пример немного в другом формате:

http://example.com/[controller-класс]/[controller-метод]/[аргументы-метода]

В данном случае будет произведено обращение к файлу News.php, в котором реализован класс с таким же именем News, далее в этом классе произойдет обращение к методу latest и в этот метод попадет значение 10, таким образом, мы запросим у нашего приложения показать 10 последних записей из раздела новостей. Конечно, форматы URL адресов могут быть значительно больше и сложнее, но на начальном этапе тебе этого будет достаточно.

У нас пока еще не создано ни одного контроллера, так давай же сделаем его!

Твой первый контроллер

Конечно, лучше всего, если ты будешь не копировать код целиком, а переписывать его руками, чтобы у тебя в памяти лучше закреплялось то, что ты пишешь. Перейди в папку app/Controllers/, создай файл с именем Pages.php и напиши в нём следующий код:

  <?php namespace App\Controllers;

  use CodeIgniter\Controller;

  class Pages extends Controller {
    
      public function index()
      {
          return view('welcome_message');
      }
      	
      public function showme($page = 'home')
      {
     
      }
  }

Итак, что ты сделал? В строке кода #1 ты указал пространство имён, к которому относится твой новый класс. В строке #3 ты подключил базовый класс (из ядра фреймворка), отвечающий за работу контроллеров. Обращаю внимание, что эти 2 строки будут присутствовать практически в каждом твоем контроллере. Далее, в строке #5 ты создал класс Pages, который расширяет или можно сказать добавляет дополнительный функционал к базовому классу Controller. Здесь тоже обращаю внимание, что все контроллеры всегда должны расширять базовый контроллер. Помимо этого, расширяя базовый контроллер, ты автоматически получаешь доступ ко всем свойствам и методам базового класса контроллера. Имена классов, которые ты создаешь, должны в точности соответствовать имени файла, который содержит этот класс. И наоборот, имя файла контроллера должно быть в точности таким же, как имя класса, которое ты придумал. В нашем случае, имя класса Pages, соответственно имя файла также должно быть Pages.php. Дальше, в строках с #7 по #10, ты создал метод с именем index(). Зачем он нужен и что он делает? Метод index() создается в любом контроллере для того, чтобы выполнять какие-то действия по умолчанию, если в строке запроса явно не указан вызов какого-либо другого метода. Например, что будет, если пользователь перейдет по адресу http://example.com/pages? Вспоминаем код в начале урока http://example.com/контроллер/метод/аргумент. Получается, что мы обращаемся только к контроллеру, а второй и третий параметр мы не указываем. В этом случае и отработает код, написанный в методе index(). В твоем случае он просто покажет стандартную страницу приветствия фреймворка. Дальше, в строках с #12 по #15, ты создал метод с именем showme, который принимает 1 аргумент (значение в скобках). Имя этого аргумента - переменная $page, которая, по умолчанию, имеет значение home. Пока этот метод не делает ничего, но чуть позже мы вдохнем в него жизнь, а пока немного отвлечемся.

Твои первые Представления

Давай пока отвлечемся от Контроллеров и поговорим о Представлениях. Как ты уже знаешь, Представления - это обычные html-страницы, с небольшим содержанием php-кода. Макет нашего блога будет иметь две фиксированные части: "Шапку" и "Подвал". Давай сделаем их.

Перейди в директорию app/Views/ и создай там папку templates.

В папке templates создай 2 файла: header.php, в котором размести код:

  <!doctype html>
  <html>
  <head>
          <title>Учебник по Codeigniter 4</title>
  </head>
  <body>

и файл footer.php, с html-кодом:

  <em>© 2019</em>
  </body>
  </html>

Эти два файла будут определять твой статический "макет" приложения. Теперь снова вернись в директорию app/Views/ и рядом с папкой templates создай еще одну папку pages. Зайди в неё и создай два файла: home.php и about.php. Там ты можешь применить любые html-теги для оформления, но самое главное - это разместить в коде вывод переменной $info, например так:

<h3>Показана страница с именем <?= $info; ?></h3>

Размести этот код в обоих файлах. Теперь, чтобы эти страницы начали отображаться, необходимо снова вернуться к Контроллерам и вдохнуть жизнь в метод showme($page = 'home').

Добавляем логику в контроллер

Ранее ты создал пустой метод showme($page = 'home') в классе Pages. Этот метод принимает всего 1 аргумент - название страницы и по умолчанию это будет страница home, которую ты только что создал. Перед загрузкой страниц, мы реализуем проверку, которая будет проверять физическое существование php-файла в директории app/Views/pages/. Добавь следующий код в метод showme():

  public function showme($page = 'home')
  {
      if ( !is_file(APPPATH.'/Views/pages/'.$page.'.php') )
      {
          throw new \CodeIgniter\Exceptions\PageNotFoundException($page);
      }

      $data['info'] = $page.'.php';

      echo view('templates/header');
      echo view('pages/'.$page, $data);
      echo view('templates/footer');
  }

Разберёмся, как и что работает. В строке #3, при помощи встроенной в язык PHP функции is_file() мы проверяем, существует ли физически файл, соответствующий названию запрашиваемой страницы. Если нет, тогда вызываем стандартное исключение фреймворка, которое отображает информацию об ошибке 404 - файл не найден. Далее, если файл найден, тогда в строке #8 мы определяем массив с именем $data, где ключ массива - это имя будущей переменной, которую ты будешь использовать в Представлениях. Запомни, передача данных в Представления (шаблоны) происходит только через массив! Помнишь, чуть выше мы создавали 2 файла и выводили там переменную $info? Так вот имя этой переменной, это и есть имя ключа массива $data. Еще раз повторяю, что имя массива может быть любым, но все данные для передачи в Представления не должны быть строкой, а только в виде массива, иначе получишь ошибку!

Движемся дальше. Рассмотрим строки с #10 по #12. В этих трёх строках мы последовательно выводим все наши Представления (шаблоны), причем в строке #11 мы как раз и передаем в шаблон наш массив $data, из которого и будет сформирована переменная $info. Здесь тебе важно запомнить, что вызов любого Представления в фреймворке Codeigniter осуществляется через echo view('путь/имя_файла'). Помнишь мы создали папку templates и в ней файл header.php? Так вот командой view('templates/header') мы и обращаемся к папке templates и конкретно к файлу header.php, вот только само расширение файла .php указывать не нужно!

Давай проверим наш код! Готов? Открывай браузер и в адресной строке напиши: http://твой-домен/pages/showme/home. Если ты не ошибся и всё сделал правильно, тогда ты должен будешь увидеть свою первую страницу. Попробуй теперь набрать такой адрес: http://твой-домен/pages/showme/about. Ну что, работает? Если нет, тогда внимательно проверь, не допустил ли ты где-то ошибку. Если всё хорошо, тогда идём дальше.

А что, если мы не хотим указывать полный путь? Например, мы хотим просто показывать страницы обращаясь по адресам: http://твой-домен/home и http://твой-домен/about? Это можно сделать очень легко, и в этом тебе поможет Маршрутизация.

Последнее в этом уроке - Маршруты

Фреймворк Codeigniter предлагет очень удобную и простую схему Маршрутизации. А что такое Маршрутизация? Тебе не знакомо это понятие? Тогда поясню. Маршрутизация - это некая таблица со списком правил, в которой ты сам прописываешь, какие контроллеры и методы нужно вызывать в зависимости от того, что пользователь ввёл в строке браузера. Помнишь мы рассматривали стандартную схему контроллер/метод/аргумент? А сейчас нам нужно изменить это поведение. Давай сделаем это!

Вся таблица маршрутов прописывается в файле app/Config/Routes.php. Открывай этот файл и проматывай практически в самый конец, до строки:

    // We get a performance increase by specifying the default
    // route since we don't have to scan directories.
    $routes->get('/', 'Home::index');

В этой строке прописано правило, которое говорит, что если происходит простое обращение к домену без параметров, тогда по умолчанию необходимо вызвать контроллер Home с методом index(). Давай изменим поведение. Замени Home на Pages и ты получишь тоже самое, ведь в нашем контроллере Pages есть такой же метод, который делает тоже самое! После этой строки добавь еще один маршрут:

$routes->get('(:any)', 'Pages::showme/$1');

Что мы сделали? Во-первых, мы добавили новое правило. Таких правил может быть сколько угодно. Во-вторых, мы указали такой модификатор как (:any), который в буквальном смысле означает "что угодно". В правой части мы указали контроллер и метод, который будет вызван, а также передали в этот метод ту строку, которую пользователь ввёл в строке браузера. Если перевести это правило на человеческий язык, то оно звучало бы так: Если пользователь, после домена, ввёл "что угодно", тогда обратись к контроллеру Pages, вызови метод showme и передай в него в качестве аргумента то, что ввёл пользователь. Слева (:any) это тоже самое, что и справа $1. Ну вот и всё. Теперь открывай браузер и введи в строку адреса: http://твой-домен/home или http://твой-домен/about и посмотри результат. Работает? Магия? Нет. Просто ты освоил Маршрутизацию :-).

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

И напоследок! Очень важно! Помни, что тебе необходимо ВСЕГДА СОБЛЮДАТЬ РЕГИСТР для файлов и директорий!!! Если ты создал файл Header.php с большой буквы, тогда и в коде ты должен будешь указать его с большой буквы!!!


Комментарии к разделу:

Пока ещё никто не оставил своего комментария. Оставить свой!

Добавить комментарий к статье:


Ваше имя:
Ваша почта:

  Закрыть