CakePHP - 快速指南


CakePHP - 概述

CakePHP 是一个开源MVC 框架。它使开发、部署和维护应用程序变得更加容易。CakePHP 有许多库可以减少大多数常见任务的过载。

CakePHP 的优点

使用 CakePHP 的优点如下:

  • 开源

  • MVC框架

  • 模板引擎

  • 缓存操作

  • 搜索引擎友好的 URL

  • 轻松的 CRUD(创建、读取、更新、删除)数据库交互。

  • 图书馆和助手

  • 内置验证

  • 本土化

  • 电子邮件、Cookie、安全性、会话和请求处理组件

  • 查看 AJAX、JavaScript、HTML 表单等的帮助程序

CakePHP 请求周期

下图描述了 CakePHP 中请求生命周期的工作原理 -

CakePHP 工作原理

典型的 CakePHP 请求周期从用户请求应用程序中的页面或资源开始。在高层,每个请求都会经历以下步骤 -

  • Web 服务器重写规则将请求定向到 webroot/index.php。

  • 您的应用程序的自动加载器和引导程序文件将被执行。

  • 配置的任何调度过滤器都可以处理请求,并可以选择生成响应。

  • 调度程序根据路由规则选择适当的控制器和操作。

  • 调用控制器的操作,并且控制器与所需的模型和组件进行交互。

  • 控制器将响应创建委托给视图生成模型数据的输出。

  • 该视图使用HelpersCells来生成响应正文和标头。

  • 响应被发送回客户端。

CakePHP - 安装

在本章中,我们将展示 CakePHP 4.0.3 的安装。我们需要安装的最低 PHP 版本是PHP 7.3

在开始安装 cakePHP 之前,您需要安装 PHP 7.3 和 Composer。

对于Windows用户,请安装或更新 PHP 版本 > 7.3 的 WAMP 服务器。

访问www.wampserver.com/en/download-wampserver-64bits/并安装它。

对于 Linux 用户,请参阅 Tutorials Point 网站,网址为www.tutorialspoint.com/php7/php7_installation_linux.htm来安装 PHP 。

安装作曲家

转到https://getcomposer.org/download/上的 Composer ,然后根据您计算机的操作系统 (OS) 单击“下载”,然后在您的系统上安装 Composer。将位置添加到 Windows 用户的 PATH 变量中,以便您可以从任何目录使用 Composer。

完成安装 Composer 后,现在让我们开始安装 CakePHP。

安装 CakePHP

Windows 用户进入 wamp 所在的文件夹,在 www/ 文件夹中创建一个文件夹cakephp4/。

对于 Linux 用户,创建文件夹var/www/html/,然后创建文件夹cakephp4/

  • cakephp4/ 是我们要安装 CakePHP 的文件夹。

使用composer执行以下命令 -

composer create-project --prefer-dist cakephp/app:4.0.3 cakephp4

当命令执行时,您应该看到以下内容 -

命令执行

安装完成后,使用 localhost 在浏览器中打开您的项目。

其路径是 http://localhost/cakephp。

Cakephp页面

CakePHP - 文件夹结构

在这里,我们将了解 CakePHP 中的文件夹结构和命名约定。让我们首先了解文件夹结构。

文件夹结构

看看下面的截图。它显示了 CakePHP 的文件夹结构。

CakePHP 的结构

下表描述了 CakePHP 中每个文件夹的作用 -

先生编号 文件夹名称和说明
1

垃圾桶

bin文件夹包含 Cake 控制台可执行文件

2

配置

config文件夹包含 CakePHP 使用(几个)配置文件。数据库连接详细信息、引导、核心配置文件等应存储在此处。

3

日志

日志文件夹通常包含您的日志文件具体取决于您的日志配置。

4

插件

插件文件夹是存储应用程序使用的插件的位置。

5

资源

相应语言环境文件夹中的国际化文件将存储在此处。例如语言环境/en_US。

6

源代码

src文件夹将是您施展魔法的地方您的应用程序文件将放置在此处,您将进行大部分应用程序开发。让我们仔细看看 src 内的文件夹。

  • 控制台 - 包含应用程序的控制台命令和控制台任务。

  • 控制器 - 包含应用程序的控制器及其组件。

  • 模型 - 包含应用程序的表、实体和Behave。

  • 视图展示类放置在这里:单元格、帮助程序和模板文件。

7

模板

模板展示文件放置在这里:元素、错误页面、布局和视图模板文件。

8

测试

测试文件夹将是您放置应用程序测试用例的位置

9

tmp

tmp文件夹是 CakePHP 存储临时数据的地方它存储的实际数据取决于 CakePHP 的配置方式,但此文件夹通常用于存储模型描述,有时还用于存储会话信息。

10

小贩

vendor文件夹是 CakePHP 和其他应用程序依赖项的安装位置做出个人承诺不编辑此文件夹中的文件。如果您修改了核心,我们无法帮助您。

11

网络根目录

webroot目录是应用程序的公共文档根目录它包含您希望公开访问的所有文件。

命名约定

命名约定并不是必须遵循的,但它是一种良好的编码实践,并且随着您的项目规模的扩大将非常有帮助。

控制器约定

控制器类名必须是复数形式,PascalCased,并且名称必须以 Controller 结尾。例如,对于 Students 类,控制器的名称可以是StudentsController。控制器上的公共方法通常公开为可通过 Web 浏览器访问的“操作”。

例如, /users /view 映射到UsersController 的view()方法。无法通过路由访问受保护或私有方法。

文件和类名称约定

大多数情况下,我们看到我们的类名文件名几乎相同。这在cakephp 中是类似的。

例如,StudentsController 类的文件名为 StudentsController.php。文件必须以模块名称保存在应用程序文件夹中的相应文件夹中。

数据库约定

用于 CakePHP 模型的表大多具有带下划线的复数名称。

例如,学生详细信息、学生分数。如果字段名称由两个单词组成,则带有下划线,例如,first_name、last_name。

模型约定

对于模型,类按照数据库表命名,名称为复数、PascalCased 并以 Table 为后缀。

例如,学生详细信息表、学生分数表

查看约定

对于视图模板,文件基于控制器功能。

例如,如果类 StudentDetailsController 有 showAll() 函数,则视图模板将命名为 show_all.php 并保存在 template/yrmodule/show_all.php 中。

CakePHP - 项目配置

在本章中,我们将了解CakePHP中的环境变量、常规配置、数据库配置电子邮件配置。

配置CakePHP默认自带一个配置文件,我们可以根据自己的需要进行修改。有一个专用文件夹“config”用于此目的。CakePHP 带有不同的配置选项。

让我们首先了解 CakePHP 中的环境变量。

环境变量

环境变量使您的应用程序在不同环境中的工作变得容易。例如,在开发服务器、测试服务器、登台服务器和生产服务器环境上。对于所有这些环境,您可以使用env() 函数来读取所需环境的配置并构建应用程序。

在您的 config 文件夹中,您将看到 config/.env.example。该文件包含将根据您的环境进行更改的所有变量。首先,您可以在配置文件夹中创建一个文件,即 config/.env 并定义这些变量并使用它们。如果您需要任何其他变量,可以将其放入该文件中。

您可以使用 env() 函数读取环境变量,如下所示 -

例子

$debug = env('APP_DEBUG', false);

第一个是您想要的环境变量的名称,第二个值是默认值。如果没有找到环境变量的值,则使用默认值。

总体配置

下表描述了各种变量的作用以及它们如何影响您的 CakePHP 应用程序。

先生编号 变量名称和描述
1

调试

更改 CakePHP 调试输出。

false = 生产模式。不显示任何错误消息、错误或警告。

true = 显示错误和警告。

2

应用程序命名空间

用于在其下查找应用程序类的命名空间。

3

应用程序基址

如果您不打算将 Apache 的 mod_rewrite 与 CakePHP 一起使用,请取消注释此定义。不要忘记也删除您的 .htaccess 文件。

4

应用程序库

应用程序所在的基本目录。如果为 false,则会自动检测到。

5

应用程序编码

定义您的应用程序使用的编码。此编码用于生成布局中的字符集并对实体进行编码。它应该与为您的数据库指定的编码值匹配。

6

应用程序.webroot

网络根目录。

7

应用程序.www根目录

Webroot 的文件路径。

8

应用程序.fullBaseUrl

应用程序根目录的完全限定域名(包括协议)。

9

应用程序.imageBaseUrl

webroot 下公共图像目录的 Web 路径。

10

应用程序.cssBaseUrl

webroot 下公共 css 目录的 Web 路径。

11

App.jsBaseUrl

webroot 下公共 js 目录的 Web 路径。

12

应用程序路径

为非基于类的资源配置路径。支持插件、模板、语言环境、子项,允许分别定义插件、视图模板和语言环境文件的路径。

13

安全盐

用于散列的随机字符串。在进行对称加密时,该值也用作 HMAC salt。

14

资产时间戳

使用正确的帮助程序时,在资产文件 URL(CSS、JavaScript、图像)末尾附加一个时间戳,即特定文件的上次修改时间。有效值为 -

  • (bool) false - 不执行任何操作(默认)。

  • (bool) true - 当 debug 为 true 时附加时间戳。

  • (字符串)'force' - 始终附加时间戳。

数据库配置

数据库可以在config/app.php 和 config/app_local.php文件中配置。该文件包含带有提供参数的默认连接,可以根据我们的选择进行修改。

下面的代码片段显示了默认参数和值,应根据要求进行修改。

配置/app_local.php

*/
   'Datasources' => [
      'default' => [
         'host' => 'localhost',
         'username' => 'my_app',
         'password' => 'secret',
         'database' => 'my_app',
         'url' => env('DATABASE_URL', null),
      ],
      /*
         * The test connection is used during the test suite.
      */
      'test' => [
         'host' => 'localhost',
         //'port' => 'non_standard_port_number',
         'username' => 'my_app',
         'password' => 'secret',
         'database' => 'test_myapp',
         //'schema' => 'myapp',
      ],
   ],

让我们详细了解config/app_local.php中的每个参数。

主持人

数据库服务器的主机名(或 IP 地址)。

用户名

数据库用户名

密码

数据库密码。

数据库

数据库名称。

港口

用于连接到服务器的 TCP 端口或 Unix 套接字。

配置/应用程序.php

'Datasources' => [
   'default' => [
      'className' => Connection::class,
      'driver' => Mysql::class,
      'persistent' => false,
      'timezone' => 'UTC',
      //'encoding' => 'utf8mb4',
      'flags' => [],
      'cacheMetadata' => true,
      'log' => false,
      'quoteIdentifiers' => false,
      //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
   ],
]   

让我们详细了解config/app.php中的每个参数。

日志
先生编号 按键及说明
1

班级名称

表示与数据库服务器的连接的类的完全命名空间类名。该类负责加载数据库驱动程序、提供 SQL 事务机制以及准备 SQL 语句等。

2

司机

用于实现数据库引擎的所有特性的驱动程序的类名。这可以是使用插件语法的短类名、完全命名空间的名称或构造的驱动程序实例。短类名的示例有 Mysql、Sqlite、Postgres 和 Sqlserver。

3

执着的

是否使用与数据库的持久连接。

4

编码

指示向服务器发送 SQL 语句时使用的字符集,如“utf8”等。

5

时区

要设置的服务器时区。

6

在里面

创建连接时应发送到数据库服务器的查询列表。

7

日志

设置为 true 以启用查询日志记录。启用后,查询将在查询日志范围内以调试级别记录。

8

引用标识符

如果您在表名或列名中使用保留字或特殊字符,则设置为 true。启用此设置将导致使用查询生成器构建的查询在创建 SQL 时具有引用的标识符。它会降低性能。

9

旗帜

应传递给底层 PDO 实例的 PDO 常量的关联数组。

10

缓存元数据

布尔值 true 或包含用于存储元数据的缓存配置的字符串。不建议禁用元数据缓存,这可能会导致性能非常差。

电子邮件配置

电子邮件可以在文件config/app.php中配置。不需要在 config/app.php 中定义电子邮件配置。没有它也可以使用电子邮件。只需使用相应的方法单独设置所有配置或加载配置数组。电子邮件默认配置是使用config()configTransport()创建的。

电子邮件配置传输

通过与交付配置文件分开定义传输,您可以轻松地跨多个配置文件重复使用传输配置。您可以为生产、开发和测试指定多种配置。每个传输都需要一个类名。有效选项如下 -

  • Mail - 使用 PHP 邮件功能发送

  • Smtp - 使用 SMTP 发送

  • 调试- 不发送电子邮件,仅返回结果

您可以通过将适当的文件添加到src/Mailer/Transport来添加自定义传输(或覆盖现有传输)。传输应命名为YourTransport.php,其中“ Your”是传输的名称。

以下是电子邮件配置传输的示例。

'EmailTransport' => [
   'default' => [
      'className' => 'Mail',
      // The following keys are used in SMTP transports
      'host' => 'localhost',
      'port' => 25,
      'timeout' => 30,
      'username' => 'user',
      'password' => 'secret',
      'client' => null,
      'tls' => null,
      'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
   ],
],

电子邮件传送配置文件

传送配置文件允许您预定义有关应用程序中的电子邮件的各种属性,并为设置指定名称。这可以节省应用程序中的重复工作,并使维护和开发变得更加容易。每个配置文件接受多个密钥。

以下是电子邮件传送配置文件的示例。

'Email' => [
   'default' => [
   
      'transport' => 'default',
      'from' => 'you@localhost',
   ],
],

CakePHP - 路由

在本章中,我们将学习以下与路由相关的主题 -

  • 路由简介
  • 转乘路线
  • 将参数传递给路由
  • 生成网址
  • 重定向网址

路由简介

在本节中,我们将了解如何实现路由、如何将参数从 URL 传递到控制器的操作、如何生成 URL 以及如何重定向到特定 URL。通常,路由在文件config/routes.php中实现。路由可以通过两种方式实现 -

  • 静态方法
  • 范围内的路线构建器

这里是一个展示这两种类型的示例。

// Using the scoped route builder.
Router::scope('/', function ($routes) {
   $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});
// Using the static method.
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);

这两个方法都会执行ArticlesController的 index 方法。在这两种方法中,作用域路由构建器提供了更好的性能。

转乘路线

Router::connect()方法用于连接路由。以下是该方法的语法 -

static Cake\Routing\Router::connect($route, $defaults =[], $options =[])

Router::connect()方法有三个参数-

  • 第一个参数是您想要匹配的 URL 模板。

  • 第二个参数包含路由元素的默认值。

  • 第三个参数包含路由选项,通常包含正则表达式规则。

这是路线的基本格式 -

$routes->connect(
   'URL template',
   ['default' => 'defaultValue'],
   ['option' => 'matchingRegex']
);

例子

在config/routes.php文件中进行更改,如下所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   // Register scoped middleware for in scopes.
      $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('/', ['controller' => 'Tests', 'action' => 'show']);
   $builder->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
   $builder->fallbacks();
});

在src/Controller/TestsController.php创建一个TestsController.php文件将以下代码复制到控制器文件中。

src/Controller/TestsController.php

<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class TestsController extends AppController {
   public function show()
   {
   }
}

src/Template下创建一个文件夹Tests,并在该文件夹下创建一个名为 show.php 的视图文件。将以下代码复制到该文件中。

src/模板/测试/show.php

<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>

通过访问以下 URL 来执行上述示例,该 URL 位于 http://localhost/cakephp4/

输出

上面的 URL 将产生以下输出。

以上网址

通过的参数

传递的参数是在 URL 中传递的参数。这些参数可以传递给控制器​​的操作。这些传递的参数通过三种方式提供给您的控制器。

作为操作方法的参数

下面的示例显示了我们如何将参数传递给控制器​​的操作。访问以下 URL:http://localhost/cakephp4/tests/value1/value2

这将匹配以下路线。

$builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);

这里,URL 中的 value1 将被分配给 arg1,value2 将被分配给 arg2。

作为数字索引数组

将参数传递给控制器​​的操作后,您可以使用以下语句获取参数。

$args = $this->request->params[‘pass’]

传递给控制器​​操作的参数将存储在 $args 变量中。

使用路由阵列

该参数也可以通过以下语句传递给操作 -

$routes->connect('/', ['controller' => 'Tests', 'action' => 'show',5,6]);

上面的语句将向 TestController 的 show() 方法传递两个参数 5 和 6。

例子

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' => 'show'],['pass' => ['arg1', 'arg2']]);
   $builder->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
   $builder->fallbacks();
});

在src/Controller/TestsController.php创建一个TestsController.php文件将以下代码复制到控制器文件中。

src/Controller/TestsController.php

<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class TestsController extends AppController {
public function show($arg1, $arg2) {
      $this->set('argument1',$arg1);
      $this->set('argument2',$arg2);
   }
}

src/Template中创建一个Tests文件夹,并在该文件夹下创建一个名为 show.php 的视图文件。将以下代码复制到该文件中。

src/模板/测试/show.php。

<h1>This is CakePHP tutorial and this is an example of Passed arguments.</h1>
<?php
   echo "Argument-1:".$argument1."<br/>";
   echo "Argument-2:".$argument2."<br/>";
?>

通过访问以下 URL http://localhost/cakephp4/tests/Virat/Kunal 来执行上述示例

输出

执行后,上述 URL 将产生以下输出。

通过论证

生成 URL

这是 CakePHP 的一个很酷的功能。使用生成的 URL,我们可以轻松更改应用程序中 URL 的结构,而无需修改整个代码。

url( string|array|null $url null , boolean $full false )

上面的函数将采用两个参数 -

  • 第一个参数是一个数组,指定以下任意项 - 'controller'、'action'、'plugin'。此外,您还可以提供路由元素或查询字符串参数。如果是字符串,则可以指定任何有效 url 字符串的名称。

  • 如果为 true,则完整的基本 URL 将添加到结果前面。默认为 false。

例子

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   // Register scoped middleware for in scopes.
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('/generate',['controller'=>'Generates','action'=>'show']);
   $builder->fallbacks();
});

在src/Controller/GeneratesController.php创建一个GeneratesController.php文件将以下代码复制到控制器文件中。

src/Controller/GeneratesController.php

<?php
declare(strict_types=1);
namespace App\Controller;
21
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class GeneratesController extends AppController {
   public function show()
   {
   }
}

在 src/Template 处创建一个生成文件夹,并在该文件夹下创建一个名为 show.php 的视图文件。将以下代码复制到该文件中。

src/模板/生成/show.php

<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>

通过访问以下 URL 来执行上述示例 -

http://localhost/cakephp4/生成

输出

上面的 URL 将产生以下输出 -

生成网址

重定向路由

当我们想要通知客户端应用程序该 URL 已被移动时,重定向路由非常有用。可以使用以下函数重定向 URL -

static Cake\Routing\Router::redirect($route, $url, $options =[])

上述函数有三个参数,如下 -

  • 描述路线模板的字符串。

  • 要重定向到的 URL。

  • 将路由中的命名元素与该元素应匹配的正则表达式相匹配的数组。

例子

在config/routes.php文件中进行更改,如下所示。在这里,我们使用了之前创建的控制器。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   // Register scoped middleware for in scopes.
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('/generate',['controller'=>'Generates','action'=>'show']);
   $builder->redirect('/redirect','https://tutorialspoint.com/');
   $builder->fallbacks();
});

通过访问以下 URL 来执行上述示例。

URL 1 - http://localhost/cakephp4/generate

URL 1 的输出

执行网址

URL 2 - http://localhost/cakephp4/redirect

URL 2 的输出

您将被重定向到 https://tutorialspoint.com

CakePHP - 控制器

顾名思义,控制器控制应用程序。它就像模型和视图之间的桥梁。控制器处理请求数据,确保调用正确的模型并呈现正确的响应或视图。

控制器类中的方法称为actions。每个控制器都遵循命名约定。Controller 类名称采用复数形式,驼峰式命名,并以 Controller — PostsController结尾。

应用控制器

AppConttroller类是所有应用程序控制器的父类。该类扩展了CakePHP 的Controller类。AppController 定义于src/Controller/AppController.php。该文件包含以下代码。

<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller {
   public function initialize(): void {
      parent::initialize();
      $this->loadComponent('RequestHandler');
      $this->loadComponent('Flash');
   }
}

AppController可用于加载将在应用程序的每个控制器中使用的组件。在 AppController 中创建的属性和方法将在扩展它的所有控制器中可用。控制器构造函数末尾将调用initialize()方法来加载组件

控制器动作

控制器类中的方法称为操作。这些操作负责为发出请求的浏览器/用户发送适当的响应。视图是通过动作的名称来呈现的,即控制器中的方法的名称。

例子

class RecipesController extends AppController {
   public function view($id) {
      // Action logic goes here.
   }
   public function share($customerId, $recipeId) {
      // Action logic goes here.
   }
   public function search($query) {
      // Action logic goes here.
   }
}

正如您在上面的示例中看到的,RecipesController3 个操作 - View、 Share 和Search

重定向

为了将用户重定向到同一控制器的另一个操作,我们可以使用 setAction() 方法。以下是 setAction() 方法的语法。

Cake\Controller\Controller::setAction($action, $args...)

以下代码将用户重定向到同一控制器的索引操作。

$this->setAction('index');

下面的例子展示了上述方法的用法。

例子

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   // Register scoped middleware for in scopes.
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf'); 
   $builder->connect('/redirect-controller',['controller'=>'Redirects','action'=>'action1']);
   $builder->connect('/redirect-controller2',['controller'=>'Redirects','action'=>'action2']);
   $builder->fallbacks();
});

在 src/Controller/RedirectsController.php创建一个RedirectsController.php文件。将以下代码复制到控制器文件中。

src/Controller/RedirectsController.php

<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class RedirectsController extends AppController {
   public function action1() {
   }
   public function action2(){
      echo "redirecting from action2";
      $this->setAction('action1');
   }
}

src/Template处创建一个Redirects目录,并在该目录下创建一个名为 action1.php 的视图文件。将以下代码复制到该文件中。

src/模板/重定向/action1.php

<h1>This is an example of how to redirect within controller.</h1>

通过访问以下 URL 来执行上述示例。

http://localhost/cakephp4/redirect-controller

输出

执行后,您将收到以下输出。

控制器

现在,访问以下 URL:http://localhost/cakephp4/redirect-controller2

上面的 URL 将为您提供以下输出。

重定向

加载模型

在 CakePHP 中,可以使用loadModel()方法加载模型。以下是loadModel()方法的语法 -

Cake\Controller\Controller::loadModel(string $modelClass, string $type)

上述函数有两个参数,如下 -

  • 第一个参数是模型类的名称。

  • 第二个参数是要加载的存储库的类型。

例子

如果您想在控制器中加载文章模型,则可以通过在控制器的操作中编写以下行来加载它。

$this->loadModel('Articles');

CakePHP - 视图

MVC 中的字母“V”代表视图。视图负责根据请求将输出发送给用户。查看类是加快开发过程的有效方法。

查看模板

CakePHP 的视图模板文件从控制器获取数据,然后渲染输出,以便可以正确地向用户显示。我们可以在模板中使用变量、各种控制结构。

模板文件存储在src/Template/中,该目录以使用这些文件的控制器命名,并以其对应的操作命名。例如,产品控制器的“view()”操作的视图文件通常可以在 src/Template/Products/view.php 中找到。

简而言之,控制器 (ProductsController) 的名称与文件夹 (Products) 的名称相同,但没有单词 Controller,并且控制器 (ProductsController) 的操作/方法 (view()) 的名称与视图文件(view.php)。

查看变量

视图变量是从控制器获取值的变量。我们可以在视图模板中使用任意数量的变量。我们可以使用set()方法将值传递给视图中的变量。这些设置的变量将在您的操作呈现的视图和布局中可用。以下是set()方法的语法。

Cake\View\View::set(string $var, mixed $value)

该方法采用两个参数 -变量的名称及其

例子

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   // Register scoped middleware for in scopes.
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('template',['controller'=>'Products','action'=>'view']);
   $builder->fallbacks();
});

在src/Controller/ProductsController.php创建一个ProductsController.php文件将以下代码复制到控制器文件中。

src/Controller/ProductsController.php

<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class ProductsController extends AppController {
public function view(){
      $this->set('Product_Name','XYZ');
   }
}

在src/Template处创建一个 Products 目录,并在该文件夹下创建一个名为 view.php 的视图文件。将以下代码复制到该文件中。

Value of variable is: <?php echo $Product_Name; ? >

通过访问以下 URL 来执行上述示例。

http://localhost/cakephp4/模板

输出

上面的 URL 将产生以下输出。

变量

CakePHP - 扩展视图

很多时候,我们在制作网页时,希望在其他页面中重复页面的某些部分。CakePHP 具有这样的功能,可以通过它在另一个视图中扩展视图,为此,我们不需要再次重复代码。

extend ()方法用于扩展View文件中的视图。该方法采用一个参数,即带有路径的视图文件的名称。提供视图文件名称时请勿使用扩展名 .ctp。

例子

在 config/routes.php 文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('extend',['controller'=>'Extends','action'=>'index']);
   $builder->fallbacks();
});

在src/Controller/ExtendsController.php创建一个ExtendsController.php文件将以下代码复制到控制器文件中。

src/Controller/ExtendsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class ExtendsController extends AppController{
      public function index(){
      }
   }
?>

src/Template处创建一个Extends目录,并在该文件夹下创建一个名为 header.php 的视图文件。将以下代码复制到该文件中。

src/模板/扩展/header.php

<div align="center">
   <h1>Common Header</h1>
</div>
<?= $this->fetch('content') ?>

Extends目录下创建另一个名为 index.php 的视图将以下代码复制到该文件中。在这里,我们扩展了上面的视图header.php。

src/模板/扩展/index.php

<?php $this->extend('header'); ?>
This is an example of extending view.

通过访问以下 URL http://localhost/cakephp4/extend 来执行上述示例

输出

执行后,您将收到以下输出。

通用标头

CakePHP - 查看元素

网页的某些部分在多个网页上重复,但位于不同的位置。CakePHP可以帮助我们重用这些重复的部分。这些可重用的部分称为元素 - 帮助框、额外菜单等。元素基本上是一个迷你视图。我们还可以在元素中传递变量。

Cake\View\View::element(string $elementPath, array $data, array $options =[]

上述函数有三个参数,如下 -

  • 第一个参数是/src/Template/element/文件夹中模板文件的名称。

  • 第二个参数是可供渲染视图使用的数据数组。

  • 第三个参数用于选项数组。例如缓存。

在这 3 个参数中,第一个是强制性的,其余的是可选的。

例子

在src/Template/element目录中创建一个名为 helloworld.php 的元素文件将以下代码复制到该文件中。

src/模板/element/helloworld.php

<p>Hello World</p>

src/Template处创建一个Elems文件夹,并在该目录下创建一个名为 index.php 的视图文件。将以下代码复制到该文件中。

src/模板/Elems/index.php

Element Example: <?php echo $this->element('helloworld'); ?>

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   $builder->connect('/element-example',['controller'=>'Elems','action'=>'index']);
   $builder->fallbacks();
});

在src/Controller/ElemsController.php创建ElemsController.php文件将以下代码复制到控制器文件中。

src/Controller/ElemsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class ElemsController extends AppController{
      public function index(){
      }
   }
?>

通过访问以下 URL http://localhost/cakephp4/element-example 来执行上述示例

输出

执行后,上面的 URL 将给出以下输出。

元素示例

CakePHP - 查看活动

我们可以将多个回调/事件与“查看事件”一起使用。这些事件有助于在某事发生之前或发生之后执行多项任务。以下是可与 CakePHP 一起使用的回调列表 -

先生编号 活动功能及说明
1

Helper::beforeRender(事件$event,$viewFile)

beforeRender方法在控制器的 beforeRender 方法之后、控制器渲染viewlayout之前调用。它接收正在渲染的文件作为参数。

2

Helper::beforeRenderFile(事件$event, $viewFile)

在渲染每个视图文件之前调用此方法。这包括元素、视图、父视图布局

3

Helper::afterRenderFile(事件$事件,$viewFile,$内容)

每个视图文件渲染后都会调用此方法。这包括元素、视图、父视图布局。回调可以修改并返回$content以更改呈现的内容在浏览器中的显示方式。

4

Helper::afterRender(事件$event, $viewFile)

该方法在视图渲染之后、布局渲染开始之前调用。

5

Helper::beforeLayout(事件$event, $layoutFile)

该方法在布局渲染开始之前调用。它接收布局文件名作为参数。

6

Helper::afterLayout(事件$event, $layoutFile)

该方法在布局渲染完成后调用。它接收布局文件名作为参数。

CakePHP - 使用数据库

在 CakePHP 中使用数据库非常容易。本章我们将了解CRUD(创建、读取、更新、删除)操作。

此外,我们还需要在 config/app_local.php 文件中配置数据库

'Datasources' => [
   'default' => [
      'host' => 'localhost',
      'username' => 'my_app',
      'password' => 'secret',
      'database' => 'my_app',
      'url' => env('DATABASE_URL', null),
   ],
   /*
      * The test connection is used during the test suite.
   */
   'test' => [
      'host' => 'localhost',
      //'port' => 'non_standard_port_number',
      'username' => 'my_app',
      'password' => 'secret',
      'database' => 'test_myapp',
      //'schema' => 'myapp',
   ],
],

默认连接具有以下详细信息 -

'host' => 'localhost',
   'username' => 'my_app',
   'password' => 'secret',
   'database' => 'my_app',

您可以根据您的选择更改详细信息,即主机、用户名、密码和数据库。

完成后,确保在 Datasources 对象的 config/app_local.php 中更新它。

现在,我们将继续上述详细信息,转到您的 phpmyadmin 或 mysql 数据库并创建用户 my_app ,如下所示 -

我的应用程序

授予必要的权限并保存。现在,我们有了 app_local.php 中提到的配置的数据库详细信息。当您检查 CakePHP 主页时,您应该看到以下内容 -

应用程序本地

现在,我们将在数据库中创建以下用户表。

CREATE TABLE `users` ( 
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `username` varchar(50) NOT NULL, 
   `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1

插入一条记录

要在数据库中插入一条记录,我们首先需要使用TableRegistry类获取一个表。我们可以使用get()方法从注册表中获取实例。get ()方法将以数据库表的名称作为参数。

这个新实例用于创建新实体。使用新实体的实例设置必要的值。现在我们必须使用TableRegistry类的实例调用save()方法,这将在数据库中插入新记录。

例子

在config/routes.php文件中进行更改,如以下程序所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/users/add', ['controller' => 'Users', 'action' => 'add']);
   $builder->fallbacks();
});

在src/Controller/UsersController.php创建一个UsersController.php文件将以下代码复制到控制器文件中。

src/controller/UsersController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\Auth\DefaultPasswordHasher;
class UsersController extends AppController{
   public function add(){
      if($this->request->is('post')){
         $username = $this->request->getData('username');
         $hashPswdObj = new DefaultPasswordHasher;
         $password = $hashPswdObj->hash($this->request->getData('password'));
         $users_table = TableRegistry::get('users');
         $users = $users_table->newEntity($this->request->getData());
         $users->username = $username;
         $users->password = $password;
         $this->set('users', $users);
         if($users_table->save($users))
         echo "User is added.";
      }
   }
}
?>

src/Template处创建一个Users目录,并在该目录下创建一个名为 add.php 的视图文件。将以下代码复制到该文件中。

src/模板/用户/add.php

<?php
   echo $this->Form->create(NULL,array('url'=>'/users/add'));
   echo $this->Form->control('username');
   echo $this->Form->control('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

通过访问以下 URL 来执行上述示例。http://localhost/cakephp4/users/add

输出

执行后,您将收到以下输出。

添加

数据将保存在用户表中,如下所示 -

显示所有

CakePHP - 查看记录

要查看数据库的记录,我们首先需要使用TableRegistry类来获取一个表。我们可以使用get()方法从注册表中获取实例。get ()方法将以数据库表的名称作为参数。

现在,这个新实例用于使用 find() 方法从数据库中查找记录。此方法将返回请求表中的所有记录。

例子

在config/routes.php文件中进行更改,如以下代码所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/users', ['controller' => 'Users', 'action' => 'index']);
   $builder->fallbacks();
});

在src/Controller/UsersController.php创建一个UsersController.php文件将以下代码复制到控制器文件中。

src/controller/UsersController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
   }
?>

在src/Template 处创建一个Users目录如果已经创建则忽略,并在该目录下创建一个名为 index.php 的View文件将以下代码复制到该文件中。

src/模板/用户/index.ctp

<a href="add">Add User</a>
<table>
   <tr>
      <td>ID</td>
      <td>Username</td>
      <td>Password</td>
      <td>Edit</td>
      <td>Delete</td>
   </tr>
   <?php
      foreach ($results as $row):
      echo "<tr><td>".$row->id."</td>";
      echo "<td<".$row-<username."</td>";
      echo "<td>".$row->password."</td>";
      echo "<td><a href='".$this-<Url->build(["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";
      echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "delete",$row->id])."'>Delete</a></td></tr>";
      endforeach;
   ?>
</table>

通过访问以下 URL http://localhost/cakephp4/users 来执行上面的示例

输出

执行后,上面的 URL 将给出以下输出。

执行后

CakePHP - 更新记录

要更新数据库中的记录,我们首先需要使用TableRegistry类获取表。我们可以使用get()方法从注册表中获取实例。get ()方法将以数据库表的名称作为参数。现在,这个新实例用于获取我们想要更新的特定记录。

使用这个新实例调用get()方法,并传递主键来查找记录,该记录将保存在另一个实例中。使用此实例设置要更新的新值,然后最后使用TableRegistry类的实例调用save()方法来更新记录。

例子

在 config/routes.php 文件中进行更改,如以下代码所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/users/edit', ['controller' => 'Users', 'action' => 'edit']);
   $builder->fallbacks();
});

在src/Controller/UsersController.php创建一个UsersController.php文件将以下代码复制到控制器文件中。

src/controller/UsersController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
      public function edit($id){
         if($this->request->is('post')){
            $username = $this->request->getData('username');
            $password = $this->request->getData('password');
            $users_table = TableRegistry::get('users');
            $users = $users_table->get($id);
            $users->username = $username;
            $users->password = $password;
            if($users_table->save($users))
            echo "User is udpated";
            $this->setAction('index');
         } else {
            $users_table = TableRegistry::get('users')->find();
            $users = $users_table->where(['id'=>$id])->first();
            $this->set('username',$users->username);
            $this->set('password',$users->password);
            $this->set('id',$id);
         }
      }
   }
?>

在 src/Template 处创建一个Users 目录,如果已经创建则忽略,并在该目录下创建一个名为index.php 的视图。将以下代码复制到该文件中。

src/模板/用户/index.php

<a href="add">Add User</a>
<table>
   <tr>
   <td>ID</td>
   <td>Username</td>
   <td>Password</td>
   <td>Edit</td>
   <td>Delete</td>
   </tr>
   <?php
      foreach ($results as $row):
      echo "<tr><td>".$row->id."</td>";
      echo "<td>".$row->username."</td>";
      echo "<td>".$row->password."</td>";
      echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";
      echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "delete",$row->id])."'>Delete</a></td></tr>";
      endforeach;
   ?>
</table>

在 Users 目录下创建另一个名为edit.php的View文件,并将以下代码复制到其中。

src/模板/用户/edit.php

<?php
   echo $this->Form->create(NULL,array('url'=>'/users/edit/'.$id));
   echo $this->Form->control('username',['value'=>$username]);
   echo $this->Form->control('password',['value'=>$password]);
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

通过访问以下 URL 并单击“编辑”链接来编辑记录来执行上述示例。

http://localhost/cakephp4/users

输出

访问上述 URL 后,将显示 users 表中的记录,如下所示 -

参观后

单击编辑按钮,它将显示以下屏幕 -

编辑按钮

现在,我们将名称 Virat 更新为 Virat123 并提交详细信息。显示的下一个屏幕如下 -

维拉特

CakePHP - 删除一条记录

要删除数据库中的记录,我们首先需要使用TableRegistry类获取表。我们可以使用get()方法从注册表中获取实例。get() 方法将以数据库表的名称作为参数。现在,这个新实例用于获取我们要删除的特定记录。

使用这个新实例调用get()方法并传递主键以查找将保存在另一个实例中的记录。使用TableRegistry类的实例调用delete方法从数据库中删除记录。

例子

在 config/routes.php 文件中进行更改,如以下代码所示。

配置/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/users/delete', ['controller' => 'Users', 'action' => 'delete']);
   $builder->fallbacks();
});

在src/Controller/UsersController.php创建一个UsersController.php文件将以下代码复制到控制器文件中。

src/controller/UsersController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
      public function delete($id){
         $users_table = TableRegistry::get('users');
         $users = $users_table->get($id);
         $users_table->delete($users);
         echo "User deleted successfully.";