如何在Ubuntu 18.04上使用LAMP设置CakePHP应用程序

CakePHP是一个开源的PHP Web框架。在本教程中,您将在Ubuntu 18.04上使用LAMP将示例Web应用程序部署到生产中。

作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。

介绍

CakePHP是一个流行且功能丰富的PHP Web框架。 它解决了Web开发中的许多常见问题,例如与数据库交互,屏蔽SQL注入以及生成视图代码。 它遵循模型 - 视图 - 控制器 (MVC)模式,它解耦应用程序的各个部分,有效地允许开发人员并行处理应用程序的不同部分。 它还提供内置的安全性和身份验证。 创建基本数据库应用程序是一个无缝过程,这使得CakePHP可用于原型设计。 但是,您也可以使用CakePHP创建完全开发的Web应用程序以进行部署。

在本教程中,您将将示例CakePHP Web应用程序部署到生产环境中。 为此,您将设置一个示例数据库和用户,配置Apache,将您的应用程序连接到数据库,并关闭调试模式。 您还将使用CakePHP的bake命令自动生成文章模型。

先决条件

在开始本教程之前,您需要:

第1步 - 安装依赖项

要准备应用程序,首先要安装CakePHP所需的PHP扩展。

首先更新包管理器缓存:

sudo apt update

CakePHP需要mbstringintlsimplexml 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

找到以下代码块:

/etc/apache2/apache2.conf中
...
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
...

AllowOverrideNone更改为All ,如下所示:

/etc/apache2/apache2.conf中
...
<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将内容提供给浏览器的位置。 在文件中找到以下行:

/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无法连接到数据库

您将看到默认的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块(如下所示):

/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 ),使用您的数据库用户密码cake_user secret ,使用数据库名称cakephp_blog第二个my_app (本教程中为cakephp_blog )。

保存并关闭文件。

在浏览器中刷新应用程序并观察“ 数据库”部分下的成功消息。 如果显示错误,请根据上述步骤仔细检查配置文件。

CakePHP可以连接到数据库

在此步骤中,您已将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:
- articles
Run `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.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

您将看到数据库中当前的文章列表,其中包含一行标题为“ 样本标题” bake命令创建了此界面,允许您创建,删除和编辑文章。 因此,它为进一步发展提供了坚实的起点。 您可以通过单击侧栏中的“ 新建文章”链接尝试添加新文章。

生成的文章用户界面

在本节中,您使用CakePHP的bake命令生成了模型,视图和控制器文件。 您现在可以创建,删除,查看和编辑文章,并将所有更改立即保存到数据库中。

在下一步中,您将禁用调试模式。

第7步 - 在CakePHP中禁用调试模式

在本节中,您将在CakePHP中禁用调试模式。 这很重要,因为在调试模式下,应用程序会显示详细的调试信息,这是一个安全风险。 完成应用程序开发后,您将完成此步骤。

使用您喜欢的编辑器打开config/app.php文件:

sudo nano config/app.php

在文件的开头附近将有一行'debug'模式。 当您打开文件时, 'debug'模式将被设置为true 根据以下内容将其更改为false

配置/ app.php
...
'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

用以下内容替换其内容:

SRC /模板/页/ 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各个方面的详细文档。 应用程序的下一步可能包括实现用户身份验证,以便每个用户都可以创建自己的文章。