Как настроить приложение CakePHP с LAMP на Ubuntu 18.04

Автор выбралFree and Open Source Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

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

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

Предпосылки

Прежде чем начать этот урок, вам понадобится:

  • Сервер под управлением Ubuntu 18.04 с корневым доступом и учетной записью sudo без полномочий root, вы можете настроить это, выполнивthis initial server setup guide.

  • Стек LAMP установлен согласноHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04. На момент написания этой статьи PHP 7.2 является последней версией.

  • Composer (менеджер пакетов PHP) установлен на вашем сервере. Чтобы узнать, как это сделать, посетитеHow To Install and Use Composer on Ubuntu 18.04. Вам нужно только выполнить первые два шага из этого урока.

  • Apache защищен с помощью Let’s Encrypt. Чтобы выполнить это предварительное условие, вам сначала необходимо настроить виртуальные хосты, следуя шагу 5How To Install Apache on Ubuntu 18.04. Затем вы можете следоватьHow To Secure Apache with Let’s Encrypt on Ubuntu 18.04, чтобы защитить Apache с помощью Let’s Encrypt. При появлении запроса включите обязательное перенаправление HTTPS.

  • Полностью зарегистрированное доменное имя. В этом руководстве будет использоватьсяexample.com. Вы можете приобрести доменное имя наNamecheap, получить его бесплатно наFreenom или воспользоваться услугами регистратора доменов по вашему выбору.

  • Обе следующие записи DNS настроены для вашего сервера. Вы можете следить заthis introduction в DigitalOcean DNS, чтобы узнать, как их добавить.

    • Запись A сexample.com, указывающая на общедоступный IP-адрес вашего сервера.

    • Запись A сwww.example.com, указывающая на общедоступный IP-адрес вашего сервера.

[[step-1 -—- install-dependencies]] == Шаг 1. Установка зависимостей

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

Начните с обновления кеша менеджера пакетов:

sudo apt update

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

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

Помните, что номера версий выше (7.2) будут меняться с новыми версиями PHP.

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

[[step-2 -—- setting-up-a-mysql-database]] == Шаг 2 - Настройка базы данных MySQL

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

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

sudo mysql -u root -p

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

Далее создайте базу данных:

CREATE DATABASE cakephp_blog;

Вы увидите вывод, похожий на:

OutputQuery OK, 1 row affected (0.00 sec)

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

Затем проинструктируйте MySQL работать с новой базой данныхcakephp_blog:

USE cakephp_blog;

Вы увидите вывод, похожий на:

OutputDatabase 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
);

Вы создали схему с пятью полями для описания статей блога:

  • id: уникальный идентификатор статьи, настроенный как первичный ключ.

  • title: заголовок статьи, объявленный как текстовое поле, содержащее максимум 50 символов.

  • body: текст статьи, объявленный как полеTEXT.

  • created: дата и время создания записи.

  • modified: дата и время изменения записи.

Вывод будет похож на:

OutputQuery OK, 0 rows affected (0.01 sec)

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

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

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

Вы увидите следующий вывод:

OutputQuery 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.

[[step-3 -—- created-the-blog-application]] == Шаг 3 - Создание приложения Blog

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

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

cd /var/www/example.com/html

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

sudo chown -R sammy .

Теперь вы создадите новое приложение CakePHP через Composer:

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 так, чтобы он указывал на новое приложение, которое сделает его видимым в вашем браузере.

[[step-4 -—- configuring-apache-to-point-to-your-app]] == Шаг 4. Настройка Apache для указания на ваше приложение

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

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

Начните с открытия глобального файла конфигурации Apache (apache2.conf) с помощью текстового редактора:

sudo nano /etc/apache2/apache2.conf

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

/etc/apache2/apache2.conf

...

        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted

...

ИзменитеAllowOverride сNone наAll, как показано ниже:

/etc/apache2/apache2.conf

...

        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted

...

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

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

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

Сначала откройте файл конфигурацииexample.com-le-ssl.conf:

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

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

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

DocumentRoot /var/www/example.com/html

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

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

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

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

После этого перезапустите Apache, чтобы отобразить новую конфигурацию:

sudo systemctl restart apache2

Теперь вы можете посетитьhttps://your_domain/ в своем браузере.

CakePHP can’t connect to the database

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

Теперь вы включили переопределение.htaccess и указали Apache на правильный каталогwebroot.

[[step-5 -—- connected-your-app-to-the-database]] == Шаг 5 - Подключение вашего приложения к базе данных

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

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

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

Откройте файлconfig/app.php, выполнив следующую команду:

sudo nano config/app.php

Найдите блокDatasources (он выглядит следующим образом):

/var/www/example.com/html/cake-blog/config/app.php

...
    '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 can connect to the database

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

[[step-6 -—- created-the-article-user-interface]] == Шаг 6 - Создание пользовательского интерфейса статьи

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

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

  • Модели представляют структуру данных.

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

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

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

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

./bin/cake bake all

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

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

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

Он правильно обнаружил определениеarticles из вашей базы данных и предлагает сгенерировать файлы для этой модели.

Испечь это, запустив:

./bin/cake bake all articles

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

OutputBake 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 на боковой панели.

The generated article user interface

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

На следующем шаге вы отключите режим отладки.

[[step-7 -—- dishibited-debug-mode-in-cakephp]] == Шаг 7 - Отключение режима отладки в CakePHP

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

Откройте файлconfig/app.php с помощью вашего любимого редактора:

sudo nano config/app.php

Рядом с началом файла будет строка для режима'debug'. При открытии файла режим'debug' будет установлен наtrue. Измените это наfalse следующим образом:

config/app.php

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

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

The debug mode error

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

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

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

Откройтеhome.ctp для редактирования:

sudo nano src/Template/Pages/home.ctp

Замените его содержимое следующим:

src/Template/Pages/home.ctp

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

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

Заключение

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

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

Related