Статические страницы
Примечание
Этот учебник предполагает, что вы скачали CodeIgniter и установили фреймворк в вашей среде разработки.
Первое, что вам нужно сделать, это настроить контроллер для обработки статических страниц. Контроллер — это просто класс, который помогает делегировать работу. Он является связующим звеном вашей веб-приложения.
Например, когда выполняется вызов:
http://example.com/news/latest/10
Мы можем предположить, что существует контроллер с именем «новости». Метод, который вызывается у новостей, будет «последние». Задача метода новостей может состоять в том, чтобы получить 10 новостных элементов и отобразить их на странице. Очень часто в MVC вы увидите шаблоны URL, которые соответствуют:
http://example.com/[controller-class]/[controller-method]/[arguments]
По мере усложнения схем 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 view($page = 'home')
{
// ...
}
}
Вы создали класс с именем Pages, с методом view(), который принимает один аргумент с именем $page. Он также имеет метод index(), такой же, как у контроллера по умолчанию в app/Controllers/Home.php; этот метод отображает приветственную страницу CodeIgniter.
Примечание
В этом руководстве упоминаются две view() функции. Одна — это метод класса, созданный с помощью public function view($page = 'home') и echo view('welcome_message') для отображения представления. Обе они — технически функции. Но когда вы создаете функцию в классе, она называется методом.
Класс Pages расширяет класс CodeIgniter\Controller. Это означает, что новый класс Pages может получать доступ к методам и переменным, определенным в классе CodeIgniter\Controller (system/Controller.php).
Контроллер — это то, что станет центром каждого запроса к вашему веб-приложению. Как и любой класс PHP, вы ссылаетесь на него внутри своих контроллеров как на $this.
Теперь, когда вы создали свой первый метод, пришло время создать некоторые основные шаблоны страниц. Мы будем создавать два «представления» (шаблоны страниц), которые будут выполнять роль нижнего колонтитула и верхнего колонтитула страницы.
Создайте заголовок в app/Views/templates/header.php и добавьте следующий код:
<!doctype html>
<html>
<head>
<title>CodeIgniter Tutorial</title>
</head>
<body>
<h1><?= esc($title) ?></h1>
Заголовок содержит базовый HTML-код, который вы хотите отобразить перед загрузкой основного представления, а также заголовок. Он также выведет переменную $title, которую мы определим позже в контроллере. Теперь создайте подвал в app/Views/templates/footer.php, включив в него следующий код:
<em>© 2021</em> </body> </html>
Примечание
Если вы внимательно посмотрите на шаблон header.php, мы используем функцию esc(). Это глобальная функция, предоставляемая CodeIgniter, чтобы помочь предотвратить атаки XSS. Вы можете узнать больше об этом здесь.
Добавление логики в контроллер
Ранее вы настраивали контроллер с методом view(). Метод принимает один параметр, который представляет имя загружаемой страницы. Тела статических страниц будут расположены в каталоге app/Views/pages/.
В этом каталоге создайте два файла с именами home.php и about.php. В этих файлах наберите любой текст, который вам нравится, — и сохраните их. Если вы хотите быть особенно неоригинальными, попробуйте «Привет, мир!».
Для загрузки этих страниц вам нужно будет проверить, действительно ли запрошенная страница существует. Это будет телом метода view() в контроллере Pages , созданном выше:
public function view($page = 'home')
{
if (! is_file(APPPATH . 'Views/pages/' . $page . '.php')) {
// Whoops, we don't have a page for that!
throw new \CodeIgniter\Exceptions\PageNotFoundException($page);
}
$data['title'] = ucfirst($page); // Capitalize the first letter
echo view('templates/header', $data);
echo view('pages/' . $page, $data);
echo view('templates/footer', $data);
}
Теперь, когда запрошенная страница существует, она загружается, включая заголовок и подвал, и отображается пользователю. Если запрошенная страница не существует, отображается ошибка «404 Страница не найдена».
Первая строка в этом методе проверяет, действительно ли страница существует. Встроенная функция PHP is_file() используется для проверки наличия файла в ожидаемом месте. PageNotFoundException — это исключение CodeIgniter, которое вызывает отображение страницы по умолчанию с ошибкой.
В шаблоне заголовка использовалась переменная $title для настройки заголовка страницы. Значение title определяется в этом методе, но вместо присвоения значения переменной оно присваивается элементу title в массиве $data.
Последнее, что нужно сделать, это загрузить представления в том порядке, в котором они должны быть отображены. Для этого будет использована функция view() , встроенная в CodeIgniter. Второй параметр функции view() используется для передачи значений в представление. Каждое значение в массиве $data присваивается переменной с именем его ключа. Таким образом, значение $data['title'] в контроллере эквивалентно значению $title в представлении.
Примечание
Любые имена файлов и каталогов, передаваемые в функцию view() , ДОЛЖНЫ совпадать с фактическим случаем названия каталога и файла, иначе система выдаст ошибки на платформах, чувствительных к регистру. Вы можете узнать больше об этом здесь.
Запуск приложения
Готовы к тестированию? Вы не можете запустить приложение с помощью встроенного сервера PHP, так как он не будет правильно обрабатывать правила .htaccess , которые предоставляются в public, и которые исключают необходимость указания «index.php/» в качестве части URL-адреса. CodeIgniter имеет собственный командный инструмент, который можно использовать.
Из командной строки, в корне вашего проекта:
php spark serve
запустит веб-сервер, доступный по порту 8080. Если вы установите поле расположения в своем браузере на localhost:8080, вы увидите приветственную страницу CodeIgniter.
Теперь вы можете попробовать несколько URL-адресов в поле расположения браузера, чтобы увидеть, что Pages контроллер, который вы создали выше, создаёт…
| URL | Покажет |
|---|---|
| localhost:8080/pages | результаты метода index внутри нашего контроллера Pages, который предназначен для отображения приветственной страницы CodeIgniter, так как «index» — это метод контроллера по умолчанию |
| localhost:8080/pages/index | приветственную страницу CodeIgniter, так как мы явно запросили метод «index» |
| localhost:8080/pages/view | страницу «home», которую вы создали выше, потому что это значение параметра «page» по умолчанию для метода view() . |
| localhost:8080/pages/view/home | покажет страницу «home», которую вы создали выше, потому что мы явно её запросили |
| localhost:8080/pages/view/about | страницу «about», которую вы создали выше, потому что мы её явно запросили |
| localhost:8080/pages/view/shop | страницу ошибки «404 - Файл не найден», так как такого файла app/Views/pages/shop.php не существует
|
Маршрутизация
Контроллер теперь работает!
Используя пользовательские правила маршрутизации, вы можете сопоставить любой URI с любым контроллером и методом, и освободиться от обычной схемы:
http://example.com/[controller-class]/[controller-method]/[arguments]
Давайте сделаем это. Откройте файл маршрутизации, расположенный в app/Config/Routes.php, и найдите раздел «Определения маршрутов» конфигурационного файла.
Единственная нескомментированная строка в начале должна быть:
$routes->get('/', 'Home::index');
Эта директива говорит, что любой входящий запрос без указанного содержимого должен обрабатываться методом index() внутри контроллера Home.
Добавьте следующую строку, **после** директивы маршрута для ‘/’.
$routes->get('(:any)', 'Pages::view/$1');
CodeIgniter читает правила маршрутизации сверху вниз и направляет запрос к первому совпавшему правилу. Каждое правило — это регулярное выражение (левая часть), сопоставленное с именем контроллера и имени метода, разделенных косыми чертами (правая часть). При поступлении запроса CodeIgniter ищет первое совпадение и вызывает соответствующий контроллер и метод, возможно, с аргументами.
Дополнительную информацию о маршрутизации можно найти в документации по маршрутизации URI.
Здесь второе правило в объекте $routes соответствует **любому** запросу, использующему символ подстановки (:any), и передает параметр методу view() класса Pages.
Теперь посетите localhost:8080/home. Была ли правильно перенаправлена маршрутизация на метод view() в контроллере pages? Отлично!
Вы должны увидеть что-то вроде следующего:
Примечание
При ручном указании маршрутов рекомендуется отключить автоматическую маршрутизацию, установив $routes->setAutoRoute(false); в файле Routes.php. Это гарантирует, что к ресурсам можно получить доступ только через определенные вами маршруты.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/tutorial/static_pages.html