Настройка приложения CakePHP на LAMP в Ubuntu 18.04

CakePHP — это популярный многофункциональный веб-фреймворк PHP. Он устраняет многие распространенные в веб-разработке проблемы, такие как взаимодействие с базой данных, защита от SQL-инъекций и генерация кода представления. Он работает по шаблону «модель-представление-контроллер» (MVC), который разделяет приложения на части, что позволяет разработчикам параллельно работать над различными частями приложения. Он также обеспечивает встроенную безопасность и аутентификацию. Базовое приложение на основе БД легко создать в CakePHP. Однако вы также можете использовать CakePHP для создания полноценных веб-приложений, готовых к развертыванию.

Данный мануал поможет вам развернуть базовое приложение CakePHP в среде производства. Для этого нужно создать пользователя и базу данных, настроить Apache, подключить приложение к БД и выключить режим отладки. Также вы узнаете, как автоматически генерировать модели статей с помощью команды CakePHP bake.

Требования

1: Установка зависимостей

Чтобы подготовить сервер к развертыванию приложения, нужно установить PHP-расширения, от которых зависит CakePHP.

Обновите локальный индекс пакетов:

sudo apt update

CakePHP нужны PHP-расширения mbstring, intl и simplexml, которые добавляют поддержку многобайтовых строк, интернационализации и обработки XML. Расширение mbstring уже установлено во время установки Composer. Вы можете установить оставшиеся библиотеки одной командой:

sudo apt install php7.2-intl php7.2-xml -y

Помните, что версия PHP может отличаться.

Вы установили зависимости CakePHP. Теперь можно настроить базу данных MySQL для среды производства.

2: Настройка базы данных MySQL

Теперь нужно создать базу данных MySQL для хранения информации о статьях блога. Также нужно создать пользователя базы данных, которого ваше приложение будет использовать для доступа к базе данных. Затем вы измените привилегии базы данных. В результате злоумышленники не смогут повлиять на работу системы даже при наличии учетных данных БД (это является важной мерой безопасности в производственной среде).

Запустите оболочку MySQL:

sudo mysql -u root -p

По запросу введите пароль, который вы выбрали во время установки стека LAMP.

Затем создайте БД:

CREATE DATABASE cakephp_blog;
Query OK, 1 row affected (0.00 sec)

Ваше приложение CakePHP будет использовать эту новую базу данных для чтения и хранения своих данных.

Затем перейдите в новую БД cakephp_blog:

USE cakephp_blog;
Database changed

Теперь создайте схему таблицы для статей блога в базе данных cakephp_blog. Выполните следующую команду:

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);

У вас есть схема с 5 полями для описания статей блога:

  • id: уникальный идентификатор статьи, который используется как первичный ключ.
  • title: заголовок статьи, текстовое поле длиной в 50 символов максимум.
  • body: текст статьи, объявленный как поле TEXT.
  • created: дата и время создания записи.
  • modified: дата и время изменения записи.

Вы увидите вывод:

Query OK, 0 rows affected (0.01 sec)

Вы создали таблицу для хранения статей в базе данных cakephp_blog. Теперь заполните ее образцами статей, выполнив следующую команду:

INSERT INTO articles (title, body, created)
VALUES ('Sample title', 'This is the article body.', NOW());

Добавив образец статьи с заголовком и телом, вы увидите следующий вывод:

Query OK, 0 rows affected (0.01 sec)

Чтобы подключить приложение CakePHP к базе данных, вам нужно создать нового пользователя БД и ограничить его привилегии:

GRANT ALL PRIVILEGES ON cakephp_blog.* TO 'cake_user'@'localhost' IDENTIFIED BY 'password';

Эта команда предоставляет все привилегии всем таблицам в базе данных.

Не забудьте заменить password  надежным паролем.

Чтобы обновить базу данных с внесенными изменениями, сбросьте привилегии:

FLUSH PRIVILEGES;

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

Выйдите из терминала MySQL, введя команду exit.

Итак, теперь у вас есть новая БД и схема, образец данных и пользователь для работы с БД. Пора настроить само приложение CakePHP.

3: Создание блога CakePHP

Установите CakePHP с помощью Composer. Использовать Composer удобно, так как он позволяет установить CakePHP из командной строки и автоматически настраивает определенные права доступа к файлам и к конфигурации.

Сначала перейдите в папку Apache:

cd /var/www/example.com/html

Apache использует этот каталог для хранения файлов, доступных в интернете. Этот каталог принадлежит пользователю root, и пользователь sudo (здесь он называется 8host), не может ничего в него записать. Чтобы исправить это, измените привилегии файловой системы:

sudo chown -R 8host.

Теперь с помощью Composer создайте новое приложение CakePHP:

composer create-project --prefer-dist cakephp/app cake-blog

Эта команда вызывает composer и позволяет ему создать новый проект с помощью create-project. Флаг —prefer-dist cakephp/app говорит composer использовать CakePHP в качестве шаблона. cake-blog – это имя нового приложения.

Выполнение этой команды может занять некоторое время.

Когда Composer попросит вас установить права доступа к папке, нажмите y, чтобы ответить «да».

Вы создали новый проект CakePHP с помощью Composer. Далее нужно настроить Apache для поддержки этого приложения, что сделает его доступным в браузере.

4: Настройка Apache

Настройте Apache для обслуживания нового приложения CakePHP, а также включите переопределение .htaccess (это является требованием CakePHP). Чтобы сделать это, нужно отредактировать конфигурационные файлы Apache.

Чтобы включить маршрутизацию, вы должны включить в Apache поддержку файлов .htaccess. Это файлы конфигурации, которые располагаются в подкаталогах приложения (при необходимости); затем Apache использует эти файлы для изменения своей глобальной конфигурации относительно запрашиваемой части приложения. Среди прочих задач эти файлы содержат правила перезаписи URL-адресов, которые нужно скорректировать.

Откройте глобальную конфигурацию Apache, apache2.conf:

sudo nano /etc/apache2/apache2.conf

Найдите следующий блок:

...
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
...

Измените значение AllowOverride с None на All:

...
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
...

Сохраните и закройте файл.

Далее укажите Apache на каталог webroot в установке CakePHP. В Ubuntu 18.04 Apache хранит свои конфигурационные файлы в каталоге /etc/apache2/sites-available. Эти файлы определяют, как Apache обрабатывает веб-запросы.

В мануале по Let’s Encrypt вы включили перенаправление HTTPS; поэтому сейчас поддерживается только HTTPS-трафик. В результате вам нужно отредактировать только файл example.com-le-ssl.conf, который настраивает трафик HTTPS.

sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf

Вам нужно изменить только одну строку – ту, которая устанавливает DocumentRoot и сообщает Apache, откуда подавать контент в браузер. Найдите следующую строку в файле:

DocumentRoot /var/www/example.com/html

Отредактируйте эту строку, чтобы она указывала на установку CakePHP, добавив следующие сегменты:

DocumentRoot /var/www/example.com/html/cake-blog/webroot

Сохраните и закройте файл. Чтобы обновить настройки, перезапустите Apache:

sudo systemctl restart apache2

Теперь откройте https://your_domain/ в браузере.

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

5: Подключение приложения к базе данных

В этом разделе вы подключите БД к приложению, чтобы ваш блог мог получить доступ к статьям. Отредактируйте файл CakePHP по умолчанию, config/app.php, чтобы установить соединение с базой данных.

Перейдите в папку приложения:

cd /var/www/example.com/html/cake-blog

Откройте этот файл:

sudo nano config/app.php

Найдите блок Datasources:

...
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
...
//'port' => 'non_standard_port_number',
'username' => 'cake_user',
'password' => 'password',
'database' => 'cakephp_blog',
...

В ‘username’ замените значение my_app именем пользователя БД (здесь это cake_user), secret замените паролем этого пользователя. Вместо второго my_app укажите имя базы данных (здесь это cakephp_blog).

Сохраните и закройте файл.

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

Вы подключили приложение CakePHP к своей БД MySQL. Далее нужно создать файлы моделей, представлений и контроллеров, которые составят пользовательский интерфейс для взаимодействия со статьями.

6: Создание интерфейса пользователя

В этом разделе мы создадим готовый интерфейс, выполнив команду CakePHP bake, которая генерирует модель статьи. В CakePHP есть операция «baking», она генерирует все необходимые базовые модели, представления и контроллеры, готовые к дальнейшей разработке. Каждое приложение на основе БД должно выполнять операции создания, чтения, обновления и удаления (CRUD). Потому эта функция bake в CakePHP полезна – она позволяет автоматически генерировать код для этих операций. В течение нескольких минут вы получите полный прототип приложения, готовый к вводу, хранению и редактированию данных.

Модели, представления и контроллеры объединяются в шаблон MVC. Их роли:

  • Модели представляют структуру данных.
  • Представления отображают данные в удобной для пользователя форме.
  • Контроллеры действуют по запросам пользователей и служат посредником между представлениями и моделями.

CakePHP хранит свой исполняемый файл CLI в bin/cake. Хотя он в основном используется для baking, он предлагает множество других команд, например, для очистки кэша.

Команда bake проверит вашу базу данных и сгенерирует модели на основе найденных определений таблиц. Запустите следующую команду:

./bin/cake bake all

Передав команду all, вы позволяете CakePHP одновременно сгенерировать модели, контроллеры и представления.

Вывод будет выглядеть так:

Bake All
---------------------------------------------------------------
Possible model names based on your database:
- articles
Run `cake bake all [name]` to generate skeleton files.

Как видите, CakePHP правильно обнаружил определение articles в БД и сгенерировал файлы для этих моделей.

Теперь запустите baking с помощью команды:

./bin/cake bake all articles

Она вернет:

Bake All
---------------------------------------------------------------
One moment while associations are detected.
Baking table class for Articles...
Creating file /var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php
Wrote `/var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php`
Deleted `/var/www/example.com/html/cake-blog/src/Model/Table/empty`
Baking entity class for Article...
Creating file /var/www/example.com/html/cake-blog/src/Model/Entity/Article.php
Wrote `/var/www/example.com/html/cake-blog/src/Model/Entity/Article.php`
Deleted `/var/www/example.com/html/cake-blog/src/Model/Entity/empty`
Baking test fixture for Articles...
Creating file /var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php
Wrote `/var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php`
Deleted `/var/www/example.com/html/cake-blog/tests/Fixture/empty`
Bake is detecting possible fixtures...
Baking test case for App\Model\Table\ArticlesTable ...
Creating file /var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php
Wrote `/var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php`
Baking controller class for Articles...
Creating file /var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php
Wrote `/var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php`
Bake is detecting possible fixtures...
...
Baking `add` view template file...
Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp
Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp`
Baking `edit` view template file...
Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp
Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp`
Bake All complete.

В выводе вы увидите, что CakePHP зарегистрировал в логах все шаги, которые он предпринял, чтобы создать функциональный шаблон для базы данных articles.

Теперь перейдите в браузере по ссылке:

https://your_domain/articles

Вы увидите список статей, находящихся в настоящее время в базе данных, который включает одну строку с названием Sample Title. Команда bake собрала этот интерфейс, позволяющий создавать, удалять и редактировать статьи. Это хорошее начало для дальнейшего развития проекта. Вы можете попробовать добавить новую статью, нажав на ссылку New Article  в боковой панели.

Теперь вы можете создавать, удалять, просматривать и редактировать статьи, а все изменения сразу будут сохраняться в БД.

7: Отключение режима отладки CakePHP

Теперь нужно остановить режим отладки CakePHP. Это важно потому, что в этом режиме приложение выводит подробную отладочную информацию, а это большие риски для безопасности.

Это нужно обязательно сделать после того, как вы закончите работу над приложением.

Откройте файл:

sudo nano config/app.php

В начале файла будет строка для режима ‘debug’. Сейчас ее значение true. Замените его на false:

...
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
...

После того как вы отключите режим отладки, на домашней странице, src/Templates/Pages/home.ctp, будет отображаться ошибка.

Error
Please replace src/Templates/Pages/home.ctp with your own version of re-enable debug mode.

Примечание: Если вы не изменили маршрут по умолчанию или не заменили содержимое home.ctp, на домашней странице приложения будет отображаться ошибка. Это связано с тем, что домашняя страница по умолчанию служит панелью состояния во время разработки, но не работает при отключенном режиме отладки.

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

Однако после отключения режима отладки ваша страница home.ctp выдает ошибку. Если вы выполнили это только в рамках данного мануала, теперь вы можете перенаправить свою домашнюю страницу в интерфейс списка статей, не отключая режим отладки. Для этого нужно отредактировать home.ctp.

sudo nano src/Template/Pages/home.ctp

Замените его содержимое этими строками:

<meta http-equiv="refresh" content="0; url=./Articles" />
<p><a href="./Articles">Click here if you are not redirected</a></p>

Этот HTML перенаправляет на контроллер Articles. В случае сбоя автоматического перенаправления пользователи также смогут перейти по ссылке.

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

Заключение

Вы успешно установили CakePHP на стек LAMP в Ubuntu 18.04. CakePHP позволяет создавать базы данных с любым количеством таблиц, и он сам создаст живой веб-редактор для данных.

CakePHP cookbook — это подробная документация по каждому аспекту CakePHP.

Далее рекомендуем настроить аутентификацию пользователей, чтобы каждый пользователь мог создавать свои собственные статьи.

Tags: , , ,