Настройка приложения CakePHP на LAMP в Ubuntu 18.04
LAMP Stack, Ubuntu | Комментировать запись
CakePHP – это популярный многофункциональный веб-фреймворк PHP. Он устраняет многие распространенные в веб-разработке проблемы, такие как взаимодействие с базой данных, защита от SQL-инъекций и генерация кода представления. Он работает по шаблону «модель-представление-контроллер» (MVC), который разделяет приложения на части, что позволяет разработчикам параллельно работать над различными частями приложения. Он также обеспечивает встроенную безопасность и аутентификацию. Базовое приложение на основе БД легко создать в CakePHP. Однако вы также можете использовать CakePHP для создания полноценных веб-приложений, готовых к развертыванию.
Данный мануал поможет вам развернуть базовое приложение CakePHP в среде производства. Для этого нужно создать пользователя и базу данных, настроить Apache, подключить приложение к БД и выключить режим отладки. Также вы узнаете, как автоматически генерировать модели статей с помощью команды CakePHP bake.
Требования
- Сервер Ubuntu 18.04 и пользователь sudo (все инструкции есть в этом мануале).
- Установленный стек LAMP (читайте Установка стека LAMP в Ubuntu 18.04). на момент написания статьи последней версией PHP является 7.2.
- Composer, менеджер пакетов PHP (см. разделы 1-2 мануала Установка и использование Composer в Ubuntu 18.04).
- Сертификат Let’s Encrypt для Apache. Для этого вам нужен виртуальный хост (см. раздел 5 мануала Быстрая установка Apache в Ubuntu 18.04). Чтобы создать сертификат, выполните мануал Создание сертификата Let’s Encrypt для Apache в Ubuntu 18.04. По запросу включите принудительную переадресацию HTTPS.
- Доменное имя. Здесь мы используем условный домен example.com.
- DNS-записи А для example.com и www.example.com, направленные на внутренний IP-адрес сервера.
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: CakePHP, LAMP stack, Ubuntu, Ubuntu 18.04