作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。
介绍
CakePHP是一个流行且功能丰富的PHP Web框架。 它解决了Web开发中的许多常见问题,例如与数据库交互,屏蔽SQL注入以及生成视图代码。 它遵循模型 – 视图 – 控制器 (MVC)模式,它解耦应用程序的各个部分,有效地允许开发人员并行处理应用程序的不同部分。 它还提供内置的安全性和身份验证。 创建基本数据库应用程序是一个无缝过程,这使得CakePHP可用于原型设计。 但是,您也可以使用CakePHP创建完全开发的Web应用程序以进行部署。
在本教程中,您将将示例CakePHP Web应用程序部署到生产环境中。 为此,您将设置一个示例数据库和用户,配置Apache,将您的应用程序连接到数据库,并关闭调试模式。 您还将使用CakePHP的bake
命令自动生成文章模型。
先决条件
在开始本教程之前,您需要:
- 运行Ubuntu 18.04并具有root访问权限和sudo非root帐户的服务器,您可以按照此初始服务器设置指南进行设置 。
- 根据如何在Ubuntu 18.04上安装Linux,Apache,MySQL,PHP(LAMP)安装LAMP 。 在撰写本文时,PHP 7.2是最新版本。
- 您的服务器上安装了Composer (PHP包管理器)。 有关如何执行此操作的指南,请参阅如何在Ubuntu 18.04上安装和使用Composer 。 您只需完成该教程的前两个步骤。
- 使用Let的加密保护Apache。 要完成此先决条件,您首先需要在如何在Ubuntu 18.04上安装Apache的第5步之后设置虚拟主机。 然后,您可以按照如何使用Ubuntu 18.04上的Let加密来保护Apache,以使用Let的加密来保护Apache。 询问时,启用强制HTTPS重定向。
- 完全注册的域名。 本教程将始终使用
example.com
。 您可以在Namecheap上购买域名,在Freenom上免费获取一个域名,或使用您选择的域名注册商。 - 为您的服务器设置了以下两个DNS记录。 您可以按照DigitalOcean DNS的介绍了解有关如何添加它们的详细信息。
- 带有
example.com
的A记录,指向服务器的公共IP地址。 - 带有
www.example.com
的A记录,指向服务器的公共IP地址。
- 带有
第1步 – 安装依赖项
要准备应用程序,首先要安装CakePHP所需的PHP扩展。
首先更新包管理器缓存:
sudo apt update
CakePHP需要mbstring
, intl
和simplexml
PHP扩展,它们增加了对多字节字符串,国际化和XML处理的支持。 您已将mbstring
安装为Composer先决条件教程的一部分。 您可以使用一个命令安装其余库:
sudo apt install php7.2-intl php7.2-xml -y
请记住,上面的版本号(7.2)将随着PHP的新版本而改变。
您为CakePHP安装了所需的依赖项。 您现在已准备好配置MySQL数据库以供生产使用。
第2步 – 设置MySQL数据库
现在,您将创建一个MySQL数据库来存储有关您博客文章的信息。 您还将创建一个数据库用户,您的应用程序将使用该用户来访问数据库。 您将修改数据库权限以实现此控制分离。 因此,即使使用数据库凭据,不良参与者也无法在系统上引发问题,这是生产环境中的重要安全预防措施。
启动MySQL shell:
sudo mysql -u root -p
询问时,输入在初始LAMP安装期间设置的密码。
接下来,创建一个数据库:
CREATE DATABASE cakephp_blog;
你会看到类似于的输出:
Query OK, 1 row affected (0.00 sec)
您的CakePHP应用程序将使用此新数据库来读取和存储生产数据。
然后,指示MySQL在新的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);
您已经创建了一个包含五个字段的模式来描述博客文章:
-
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
数据库上提供了用户权限,从而加强了安全性。
输入exit
退出MySQL终端。
您已使用模式创建了一个新数据库,并使用示例数据填充该数据库,并创建了适当的数据库用户。 在下一步中,您将自己设置CakePHP应用程序。
第3步 – 创建博客应用程序
在本节中,您将使用Composer安装示例CakePHP应用程序。 使用Composer是有利的,因为它允许您从命令行安装CakePHP,它会自动设置某些文件权限和配置文件。
首先,导航到Apache Web服务器文件夹:
cd /var/www/example.com/html
Apache使用此目录存储对外界可见的文件。 root
用户拥有此目录,因此您的非root用户sammy
无法向其写入任何内容。 要更正此问题,您将通过运行以下命令更改文件系统权限:
sudo chown -R sammy .
您现在将通过Composer创建一个新的CakePHP应用程序:
composer create-project --prefer-dist cakephp/app cake-blog
在这里,您调用了composer
并指示它使用create-project
创建一个新create-project
。 --prefer-dist cakephp/app
告诉composer
使用CakePHP作为模板, cake-blog
作为新应用程序的名称。
请记住,此命令可能需要一些时间才能完成。
当Composer要求您设置文件夹权限时,请回答y
。
在本节中,您使用Composer创建了一个新的CakePHP项目。 在下一步中,您将配置Apache以指向新应用程序,这将使其在您的浏览器中可见。
第4步 – 配置Apache指向您的应用程序
现在,您将为新的CakePHP应用程序配置Apache,并启用.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指向CakePHP安装中的webroot
目录。 Apache将其配置文件存储在/etc/apache2/sites-available
Ubuntu 18.04上。 这些文件控制Apache处理Web请求的方式。
在Let的加密先决条件教程中,您启用了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将内容提供给浏览器的位置。 在文件中找到以下行:
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成功页面。 您会注意到有一个块表明您的应用程序无法连接到数据库。 在下一步中,您将通过将应用程序连接到数据库来解决此问题。
您现在已启用.htaccess
覆盖,并将Apache指向正确的webroot
目录。
第5步 – 将您的应用程序连接到数据库
在本节中,您将数据库连接到您的应用程序,以便您的博客可以访问这些文章。 您将编辑CakePHP的默认config/app.php
文件以设置与数据库的连接。
导航到app文件夹:
cd /var/www/example.com/html/cake-blog
通过运行以下命令打开config/app.php
文件:
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
),使用您的数据库用户密码cake_user
secret
,使用数据库名称cakephp_blog
第二个my_app
(本教程中为cakephp_blog
)。
保存并关闭文件。
在浏览器中刷新应用程序并观察“ 数据库”部分下的成功消息。 如果显示错误,请根据上述步骤仔细检查配置文件。
在此步骤中,您已将CakePHP应用程序连接到MySQL数据库。 在下一步中,您将生成模型,视图和控制器文件,这些文件将构成用于与文章交互的用户界面。
第6步 – 创建文章用户界面
在本节中,您将通过运行CakePHP bake
命令创建一个即用型文章界面,该命令可生成文章模型。 在CakePHP中,烘焙会在基本状态下生成所有必需的模型,视图和控制器,以便进一步开发。 每个数据库应用程序都必须允许创建,读取,更新和删除(CRUD)操作,这使得CakePHP的bake
功能可用于自动生成这些操作的代码。 在几分钟内,您将获得应用程序的完整原型,准备输入,存储和编辑数据。
模型,视图和控制器与MVC模式有关。 他们的角色是:
- 模型代表数据结构。
- 视图以用户友好的方式呈现数据。
- 控制器根据用户请求执行操作,并充当视图和模型之间的中介。
CakePHP将其CLI可执行文件存储在bin/cake
。 虽然它主要用于烘焙,但它提供了大量其他命令,例如用于清除各种缓存的命令。
bake
命令将检查您的数据库,并根据它找到的表定义生成模型。 首先运行以下命令:
./bin/cake bake all
通过传递all
命令,您将指示CakePHP一次生成模型,控制器和视图。
您的输出将如下所示:
Bake All---------------------------------------------------------------Possible model names based on your database:- articlesRun `cake bake all [name]` to generate skeleton files.
它已从您的数据库中正确检测到articles
定义,并提供为该模型生成文件。
通过运行来烘焙它:
./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.phpWrote `/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.phpWrote `/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.phpWrote `/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.phpWrote `/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.phpWrote `/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.ctpWrote `/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.ctpWrote `/var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp`Bake All complete.
在输出中,您将看到CakePHP已记录为articles
数据库创建功能样板文件所花费的所有步骤。
现在,在浏览器中导航到以下内容:
https://your_domain/articles
您将看到数据库中当前的文章列表,其中包含一行标题为“ 样本标题” 。 bake
命令创建了此界面,允许您创建,删除和编辑文章。 因此,它为进一步发展提供了坚实的起点。 您可以通过单击侧栏中的“ 新建文章”链接尝试添加新文章。
在本节中,您使用CakePHP的bake
命令生成了模型,视图和控制器文件。 您现在可以创建,删除,查看和编辑文章,并将所有更改立即保存到数据库中。
在下一步中,您将禁用调试模式。
第7步 – 在CakePHP中禁用调试模式
在本节中,您将在CakePHP中禁用调试模式。 这很重要,因为在调试模式下,应用程序会显示详细的调试信息,这是一个安全风险。 完成应用程序开发后,您将完成此步骤。
使用您喜欢的编辑器打开config/app.php
文件:
sudo nano config/app.php
在文件的开头附近将有一行'debug'
模式。 当您打开文件时, 'debug'
模式将被设置为true
。 根据以下内容将其更改为false
:
...'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),...
关闭调试模式后,位于src/Templates/Pages/home.ctp
将显示错误。
注意:如果您尚未更改默认路由或替换home.ctp
的内容,则应用程序的主页现在将显示错误。 这是因为默认主页在开发期间用作状态仪表板,但在禁用调试模式时不起作用。
您已禁用调试模式。 从现在开始发生的任何错误和异常及其跟踪都不会向最终用户显示,从而加强了应用程序的安全性。
但是,在禁用调试模式之后, home.ctp
将显示错误。 如果您仅为本教程的目的完成了此步骤,则现在可以将主页重定向到文章列表界面,同时禁用调试模式。 您将通过编辑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
控制器提供的博客文章列表界面来修复主页的错误。
结论
您现在已经在Ubuntu 18.04上的LAMP上成功设置了CakePHP应用程序。 使用CakePHP,您可以创建一个包含任意数量的表的数据库,它将为数据生成实时Web编辑器。
CakePHPRecipe提供了有关CakePHP各个方面的详细文档。 应用程序的下一步可能包括实现用户身份验证,以便每个用户都可以创建自己的文章。