CakePHP - 快速指南

CakePHP - 概述

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

CakePHP 的优势

使用 CakePHP 的优势如下 −

  • 开源

  • MVC 框架

  • 模板引擎

  • 缓存操作

  • 搜索引擎友好 URL

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

  • 库和帮助程序

  • 内置验证

  • 本地化

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

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

CakePHP 请求周期

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

CakePHP Works

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

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

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

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

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

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

  • 控制器将响应创建委托给 View,以生成由模型数据产生的输出。

  • 视图使用 HelpersCells 生成响应主体和标头。

  • 响应被发送回客户端。

CakePHP - 安装

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

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

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

转到 www.wampserver.com/en/download-wampserver-64bits/ 并安装它。

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

安装 Composer

转到 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

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

Command Executes

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

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

Cakephp Page

CakePHP - 文件夹结构

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

文件夹结构

查看以下屏幕截图。它显示了 CakePHP 的文件夹结构。

CakePHP 的结构

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

Sr.No 文件夹名称和说明
1

bin

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

2

config

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

3

logs

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

4

plugins

plugins 文件夹是存储应用程序使用的插件的地方。

5

resources

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

6

src

src 文件夹将是您施展魔法的地方。它是放置应用程序文件的地方,您将在那里完成大部分应用程序开发。让我们仔细看看 src 内的文件夹。

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

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

  • Model − 包含应用程序的表、实体和行为。

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

7

templates

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

8

tests

tests文件夹将用于放置应用程序的测试用例。

9

tmp

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

10

vendor

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

11

webroot

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

命名约定

命名约定不是必须遵循的,但它是一种很好的编码实践,随着项目的发展,它将非常有用。

控制器约定

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

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

文件和类名约定

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

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

数据库约定

用于 CakePHP 模型的表,大多数名称为带下划线的复数形式。

例如,student_details、student_marks。如果字段名称由两个单词组成,例如 first_name、last_name,则字段名称带有下划线。

模型约定

对于模型,类按数据库表命名,名称为复数,采用 PascalCased 格式,后缀为 Table。

例如,StudentDetailsTable、StudentMarksTable

视图约定

对于视图模板,文件基于控制器函数。

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

CakePHP - 项目配置

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

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

让我们从了解 CakePHP 中的环境变量开始。

环境变量

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

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

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

Example

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

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

常规配置

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

Sr.No 变量名称和说明
1

debug

更改 CakePHP 调试输出。

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

true = 显示错误和警告。

2

App.namespace

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

3

App.baseUrl

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

4

App.base

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

5

App.encoding

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

6

App.webroot

webroot 目录。

7

App.wwwRoot

webroot 的文件路径。

8

App.fullBaseUrl

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

9

App.imageBaseUrl

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

10

App.cssBaseUrl

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

11

App.jsBaseUrl

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

12

App.paths

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

13

Security.salt

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

14

Asset.timestamp

使用适当的帮助程序时,在资产文件 URL(CSS、JavaScript、图像)末尾附加一个时间戳,该时间戳是特定文件的最后修改时间。有效值为 −

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

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

  • (string) 'force' - 始终附加时间戳。

数据库配置

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

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

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',
      ],
   ],

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

host

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

username

数据库用户名

password

数据库密码。

database

数据库名称。

port

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

config/app.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 中的每个参数。

log
Sr.No key 键 & 描述
1

className

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

2

driver

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

3

persistent

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

4

encoding

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

5

timezone

要设置的服务器时区。

6

init

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

7

log

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

8

quoteIdentifiers

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

9

flags

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

10

cacheMetadata

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

电子邮件配置

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

电子邮件配置传输

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

  • 邮件 − 使用 PHP 邮件函数发送

  • Smtp −使用 SMTP 发送

  • 调试 − 不发送电子邮件,只返回结果

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

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

'EmailTransport' => [
   'default' => [
      'className' => 'Mail',
      // SMTP 传输中使用以下键
      '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 传递到控制器的操作、如何生成 URL 以及如何重定向到特定 URL。通常,路由在文件 config/routes.php 中实现。路由可以通过两种方式实现 −

  • 静态方法
  • 作用域路由构建器

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

// 使用作用域路由构建器。
Router::scope('/', function ($routes) {
   $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});
// 使用静态方法。
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);

这两种方法都会执行 ArticlesController 的 index 方法。在这两种方法中,scoped route builder 的性能更好。

连接路由

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

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

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

  • 第一个参数用于您希望匹配的 URL 模板。

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

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

以下是路由的基本格式 −

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

示例

config/routes.php 文件中进行如下更改。

config/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('/', ['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 的 View 文件。将以下代码复制到该文件中。

src/Template/Tests/show.php

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

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

输出

上述 URL 将产生以下输出。

Above 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 文件中进行更改,如以下程序所示。

config/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('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 的 View 文件。将以下代码复制到该文件中。

src/Template/Tests/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 将产生以下输出。

Passed Argument

生成 URL

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

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

上述函数将接受两个参数 −

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

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

示例

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

config/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('/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 创建一个文件夹 Generates,并在该文件夹下创建一个名为 show.php 的 View 文件。将以下代码复制到该文件中。

src/Template/Generates/show.php

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

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

http://localhost/cakephp4/generate

输出

上述 URL 将产生以下输出 −

Generating URL

重定向路由

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

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

上述函数有三个参数,如下所示 −

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

  • 要重定向到的 URL。

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

示例

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

config/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('/generate',['controller'=>'Generates','action'=>'show']);
   $builder->redirect('/redirect','https://tutorialspoint.com/');
   $builder->fallbacks();
});

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

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

URL 1 的输出

Execute URL

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

URL 2 的输出

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

CakePHP - 控制器

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

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

AppController

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) {
    // 操作逻辑在此处。
    }
    public function share($customerId, $recipeId) {
    // 操作逻辑在此处。
    }
    public function search($query) {
    // 操作逻辑在此处。
    }
}

如上例所示,RecipesController 有 3 个操作,除了 View、Share 和 Search

重定向

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

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

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

$this->setAction('index');

以下示例显示了上述方法的用法。

示例

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

config/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('/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 的 View 文件。将以下代码复制到该文件中。

src/Template/Redirects/action1.php

<h1>这是如何在控制器内重定向的示例。</h1>

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

http://localhost/cakephp4/redirect-controller

输出

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

Controller

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

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

Redirect

加载模型

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

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

上述函数有两个参数,如下所示 −

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

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

示例

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

$this->loadModel('Articles');

CakePHP - 视图

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

视图模板

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

模板文件存储在 src/Template/ 中,该目录以使用这些文件的控制器命名,并以其对应的操作命名。例如,Products 控制器的 "view()" 操作的 View 文件通常位于 src/Template/Products/view.php 中。

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

视图变量

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

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

此方法接受两个参数 − 变量的名称变量的值

示例

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

config/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('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 的 View 文件。将以下代码复制到该文件中。

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

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

http://localhost/cakephp4/template

输出

上述 URL 将产生以下输出。

Variables

CakePHP - 扩展视图

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

extend() 方法用于扩展 View 文件中的视图。此方法接受一个参数,即带路径的视图文件的名称。提供视图文件的名称时不要使用扩展名 .ctp。

示例

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

config/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 的 View 文件。将以下代码复制到该文件中。

src/Template/Extends/header.php

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

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

src/Template/Extends/index.php

<?php $this->extend('header'); ?>
这是扩展视图的一个示例。

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

输出

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

Common Header

CakePHP - 视图元素

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

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

上述函数有三个参数,如下所示 −

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

  • 第二个参数是要提供给渲染视图的数据数组。

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

在这 3 个参数中,第一个是必需的,其余的是可选的。

示例

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

src/Template/element/helloworld.php

<p>Hello World</p>

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

src/Template/Elems/index.php

元素示例:<?php echo $this->element('helloworld'); ?>

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

config/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 将为您提供以下输出。

Element Example

CakePHP - 查看事件

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

Sr.No 事件函数 &描述
1

Helper::beforeRender(Event $event,$viewFile)

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

2

Helper::beforeRenderFile(Event $event, $viewFile)

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

3

Helper::afterRenderFile(Event $event, $viewFile, $content)

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

4

Helper::afterRender(Event $event, $viewFile)

此方法在视图渲染后调用,但在布局渲染开始之前调用。

5

Helper::beforeLayout(Event $event, $layoutFile)

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

6

Helper::afterLayout(Event $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,如下所示 −

My App

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

App Local

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

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 文件中进行更改,如以下程序所示。

config/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 的 View 文件。将以下代码复制到该文件中。

src/Template/Users/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

输出

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

Added

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

Show All

CakePHP - 查看记录

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

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

示例

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

config/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.phpView 文件。将以下代码复制到该文件中。

src/Template/Users/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 将为您提供以下输出。

Upon Execution

CakePHP - 更新记录

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

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

示例

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

config/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/Template/Users/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.phpView 文件,并将以下代码复制到其中。

src/Template/Users/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 后,将显示用户表中的记录,如下所示 −

访问后

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

编辑按钮

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

Virat

CakePHP - 删除记录

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

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

示例

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

config/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.";
         $this->setAction('index');
      }
   }
?>

只需在 Users 目录下创建一个名为 delete.ctp 的空 View 文件即可。

src/Template/Users/delete.ctp

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

src/Template/Users/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:85/CakePHP/users

输出

访问上述 URL 并单击删除链接后,您将收到以下输出,您可以在其中删除记录。

删除链接

单击删除链接以删除记录。

用户已删除

CakePHP - 服务

本章介绍 CakePHP 中可用的身份验证过程的信息。

身份验证

身份验证是识别正确用户的过程。 CakePHP 支持三种类型的身份验证。

  • FormAuthenticate − 它允许您根据表单 POST 数据对用户进行身份验证。通常,这是用户输入信息的登录表单。这是默认的身份验证方法。

  • BasicAuthenticate − 它允许您使用基本 HTTP 身份验证对用户进行身份验证

  • DigestAuthenticate − 它允许您使用摘要 HTTP 身份验证对用户进行身份验证。

FormAuthentication 示例

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

config/routes.php

<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
Router::defaultRouteClass('DashedRoute');
Router::scope('/', function (RouteBuilder $routes) {
   $routes->connect('/auth',['controller'=>'Authexs','action'=>'index']);
   $routes->connect('/login',['controller'=>'Authexs','action'=>'login']);
   $routes->connect('/logout',['controller'=>'Authexs','action'=>'logout']);
   $routes->fallbacks('DashedRoute');
});
Plugin::routes();

按照以下程序所示更改 AppController.php 文件的代码。

src/Controller/AppController.php

<?php
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;
use Cake\Controller\Component\AuthComponent;
class AppController extends Controller {
   public function initialize() {
      parent::initialize();
      $this->loadComponent('RequestHandler');
      $this->loadComponent('Flash');
         $this->loadComponent('Auth', [
            'authenticate' => [
               'Form' => [
                  'fields' => [
               'username' => 'username',
               'password' => 'password'
            ]
         ]
      ],
      'loginAction' => [
         'controller' => 'Authexs',
         'action' => 'login'
      ],
      'loginRedirect' => [
         'controller' => 'Authexs',
         'action' => 'index'
      ],
      'logoutRedirect' => [
         'controller' => 'Authexs',
         'action' => 'login'
      ]
   ]);
}
public function beforeFilter(Event $event) {
      $this->Auth->allow(['index','view']);
      $this->set('loggedIn', $this->Auth->user());
   }
}

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

src/Controller/AuthexsController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\Event\Event;
use Cake\Auth\DefaultPasswordHasher;
class AuthexsController extends AppController {
   var $components = array('Auth');
   public function index(){
   }
   public function login(){
      if($this->request->is('post')) {
         $user = $this->Auth->identify();
         if($user){
            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
         } else
         $this->Flash->error('Your username or password is incorrect.');
      }
   }
   public function logout(){
      return $this->redirect($this->Auth->logout());
   } 
}
?>

src/Template 处创建一个目录 Authexs,并在该目录下创建一个名为 login.phpView 文件。将以下代码复制到该文件中。

src/Template/Authexs/login.php

<?php
   echo $this->Form->create();
   echo $this->Form->control('username');
   echo $this->Form->control('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

创建另一个名为 logout.phpView 文件。将以下代码复制到该文件中。

src/Template/Authexs/logout.php

您已成功退出。

创建另一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Authexs/index.php

You are successfully logged in. 
<?php 
   echo $this->Html->link('logout',[
      "controller" => "Authexs","action" => "logout"
   ]); 
?>

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

http://localhost/cakephp4/auth

输出

由于已实施身份验证,一旦您尝试访问上述 URL,您将被重定向到如下所示的登录页面。

Authentication

提供正确的凭据后,您将登录并重定向到如下所示的屏幕。

Redirected

单击 logout 链接后​​,您将再次被重定向到登录屏幕。

CakePHP - 错误和异常处理

需要有效处理系统故障以确保系统平稳运行。 CakePHP 带有默认错误捕获功能,可在错误发生时打印并记录错误。此错误处理程序还用于捕获异常

当 debug 为 true 时,错误处理程序显示错误;当 debug 为 false 时,错误处理程序记录错误。CakePHP 有许多异常类,内置异常处理将捕获任何未捕获的异常并呈现有用的页面。

错误和异常配置

错误和异常可在文件 config\app.php 中配置。错误处理接受一些选项,允许您为应用程序定制错误处理 −

选项 数据类型 描述
errorLevel int

您想要捕获的错误级别。使用内置的 php 错误常量和位掩码来选择您感兴趣的错误级别。

trace bool

在日志文件中包含错误的堆栈跟踪。每次发生错误后,堆栈跟踪都将包含在日志中。这有助于查找错误发生的位置/时间。

exceptionRenderer string

负责呈现未捕获异常的类。如果您选择自定义类,则应将该类的文件放在src/Error中。此类需要实现 render() 方法。

log bool

当为 true 时,异常及其堆栈跟踪将记录到 Cake\Log\Log

skipLog array

不应记录的异常类名数组。这对于删除 NotFoundExceptions 或其他常见但不感兴趣的日志消息很有用。

extraFatalErrorMemory int

设置为遇到致命错误时增加内存限制的兆字节数。这为完成日志记录或错误处理提供了喘息空间。

示例

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

config/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('/exception/:arg1/:arg2',
      ['controller'=>'Exps','action'=>'index'],
      ['pass' => ['arg1', 'arg2']]);
   $builder->fallbacks();
});

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

src/Controller/ExpsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Core\Exception\Exception;
   class ExpsController extends AppController {
      public function index($arg1,$arg2) {
         try{
            $this->set('argument1',$arg1);
            $this->set('argument2',$arg2);
            if(($arg1 > 1 || $arg1 > 10) || ($arg2 < 1 || $arg2 > 10))
               throw new Exception("One of the number is out of range [1-10].");
         } catch(\Exception $ex){
            echo $ex->getMessage();
         }
      }
   }
?>

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

src/Template/Exps/index.php

这是 CakePHP 教程,这是传递参数的示例。
参数 1:<?=$argument1?><br/> 参数 2:<?=$argument2?><br/>

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

http://localhost/cakephp4/exception/5/0

输出

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

Arguments

CakePHP - 日志记录

在 CakePHP 中记录日志是一项非常简单的任务。您只需使用一个函数。您可以记录错误、异常、用户活动、用户采取的操作,以及任何后台进程(如 cronjob)。在 CakePHP 中记录数据很容易。 log() 函数由 LogTrait 提供,它是几乎所有 CakePHP 类的共同祖先。

日志配置

我们可以在文件 config/app.php 中配置日志。文件中有一个日志部分,您可以在其中配置日志选项,如以下屏幕截图所示。

Programming

默认情况下,您将看到已为您配置的两个日志级别 − errordebug。每个级别将处理不同级别的消息。

CakePHP 支持各种日志级别,如下所示 −

  • Emergency − S系统无法使用

  • Alert − 必须立即采取行动

  • Critical − 严重情况

  • Error − 错误情况

  • Warning − 警告情况

  • Notice − 正常但重要的情况

  • Info − 信息性消息

  • Debug −调试级别消息

写入日志文件

我们可以通过两种方式写入日志文件。

第一种是使用静态 write() 方法。以下是静态 write() 方法的语法。

语法 write( integer|string $level, mixed $message, string|array $context [] )
参数

正在写入的消息的严重性级别。该值必须是与已知级别匹配的整数或字符串。

要记录的消息内容。

用于记录消息的其他数据。可以传递特殊范围键,用于进一步过滤要使用的日志引擎。如果传递了字符串或数字索引数组,它将被视为范围键。有关日志范围的更多信息,请参阅 Cake\Log\Log::config()

返回值

布尔值

描述

将给定的消息和类型写入所有已配置的日志适配器。已配置的适配器会传递 $level 和 $message 变量。 $level 是以下字符串/值之一。

第二种方法是使用 log() 快捷方式 函数,该函数在任何使用 LogTrait 的程序上都可用。调用 log() 将在内部调用 Log::write()

示例

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

config/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('logex',['controller'=>'Logexs','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/LogexsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Log\Log;
   class LogexsController extends AppController{
      public function index(){
         /*The first way to write to log file.*/
         Log::write('debug',"Something didn't work.");
         /*The second way to write to log file.*/
         $this->log("Something didn't work.",'debug');
      }
   }
?>

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

src/Template/Logexs/index.php

日志文件中写入了一些内容。检查日志文件 logs\debug.log

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

http://localhost/cakephp4/logex

输出

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

Debugs

日志将添加到 log/debug.log 文件 −

Logfile

CakePHP - 表单处理

CakePHP 提供各种内置标签,以便轻松安全地处理 HTML 表单。与许多其他 PHP 框架一样,HTML 的主要元素也是使用 CakePHP 生成的。以下是用于生成 HTML 元素的各种函数。

以下函数用于生成选择选项

语法 _selectOptions( array $elementsarray(), array $parentsarray(), boolean $showParentsnull, array $attributesarray() )
参数
  • 要格式化的元素

  • OPTGROUP 的父元素

  • 是否显示父元素

  • HTML 属性

返回 数组
描述 返回格式化的 OPTION/OPTGROUP 元素数组

以下函数用于生成 HTML select 元素

语法 select( string $fieldName, array $options array(), array $attributes array() )
参数

SELECT 的 Name 属性

SELECT 元素中使用的 OPTION 元素数组(作为 'value'=>'Text' 对)。

返回 格式化的 SELECT 元素。
描述 返回格式化的 SELECT 元素。

以下函数用于在 HTML 页面上生成按钮

语法

Button(string $title, array $optionsarray() )

参数
  • 按钮的标题。不自动进行 HTML 编码。

  • 选项和 HTML 属性数组

返回 HTML 按钮标签。
说明

创建一个 <button> 标签。type 属性默认为 type="submit"。您可以使用 $options['type'] 将其更改为其他值。

以下函数用于在 HTML 页面上生成复选框

语法 Checkbox(string $fieldName, array $optionsarray() )
参数
  • 字段名称,例如"Modelname.fieldname"

  • HTML 属性数组。可能的选项包括 value、checked、hiddenField、disabled、default。

返回 HTML 文本输入元素。
描述 创建一个复选框输入小部件。

以下函数用于在 HTML 页面上创建表单

语法 create(mixed $modelnull, array $optionsarray())
参数
  • 定义表单的模型名称。应包括插件模型的插件名称。例如 ContactManager.Contact。如果传递了数组并且 $options 参数为空,则该数组将用作选项。如果为 false,则不使用任何模型。

  • html 属性和选项的数组。可能的选项包括 type、action、url、default、onsubmit、inputDefaults、encoding。

返回

格式化的打开 FORM 标签。

说明 返回 HTML FORM 元素。

以下函数用于在 HTML 页面上提供文件上传功能

语法

file(string $fieldName, array $optionsarray() )

参数
  • 表单中字段的名称"Modelname.fieldname"

  • HTML 属性数组。

返回

生成的文件输入。

描述

创建文件输入小部件。

以下函数用于在 HTML 页面上创建隐藏元素

语法

hidden( string $fieldName , array $optionsarray() )

参数
  • 字段名称,格式为"Modelname.fieldname"

  • HTML 属性数组。

返回

生成的隐藏输入

描述

创建隐藏输入字段

以下函数用于生成HTML 页面上的 输入元素

语法

Input(string $fieldName , array $options array() )

参数
  • 这应该是"Modelname.fieldname"

  • 每种类型的输入都有不同的选项

返回

已完成的表单小部件

描述

生成带有标签和包装器 div 的表单输入元素

以下函数用于在 HTML 上生成单选按钮页面。

语法

Radio(string $fieldName , array $optionsarray() , array $attributesarray() )

参数
  • 字段名称,如"Modelname.fieldname"

  • 单选按钮选项数组。

  • HTML 属性数组,以及上述特殊属性。

返回 已完成的单选小部件设置
描述 创建一组单选小部件。默认情况下将创建图例和字段集。使用 $options 来控制这一点。

以下函数用于在 HTML 页面上生成 提交 按钮。

语法 Submit(string $caption null, array $options array() )
参数
  • 按钮上显示的标签,或者如果字符串包含 :// 或扩展名 .jpg、.jpe、.jpeg、.gif、.png。如果扩展名存在,并且第一个字符是 /,则使用图像,图像相对于 webroot,或者如果第一个字符不是 /,则图像相对于 webroot/img。

  • 选项数组。可能的选项有 div、before、after、type 等。

返回

HTML 提交按钮

描述 创建提交按钮元素。此方法将生成可用于提交的 <input /> 元素,并使用 $options 重置表单。可以通过为 $caption 提供图像路径来创建图像提交。

以下函数用于在 HTML 页面上生成 textarea 元素

语法

Textarea(string $fieldName , array $options array() )

参数
  • 字段名称,格式为"Modelname.fieldname"

  • HTML 属性数组,特殊选项,如 escape

返回 生成的 HTML 文本输入元素
描述 创建文本区域小部件

示例

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

config/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('register',['controller'=>'Registrations','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/RegistrationsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class RegistrationsController extends AppController{
      public function index(){
         $country = array('India','United State of America','United Kingdom');
         $this->set('country',$country);
         $gender = array('Male','Female');
         $this->set('gender',$gender);
      }
   }
?>

src/Template 处创建一个目录 Registrations,并在该目录下创建一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Registrations/index.php

<?php
   echo $this->Form->create(NULL,array('url'=>'/register'));
   echo '<label for="country">Country</label>';
   echo $this->Form->select('country',$country);
   echo '<label for="gender">Gender</label>';
   echo $this->Form->radio('gender ',$gender);
   echo '<label for="address">Address</label>';
   echo $this->Form->textarea('address');
   echo $this->Form->file('profilepic');
   echo '<div>'.$this->Form->checkbox('terms').
      '<label for="country">Terms ∓ Conditions</label></div>';
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

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

http://localhost/cakephp4/register

输出

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

Condition

CakePHP - 国际化

与许多其他框架一样,CakePHP 也支持国际化。我们需要按照以下步骤从单一语言过渡到多种语言。

步骤 1

创建单独的语言环境目录 resources\locales

步骤 2

在目录 src\Locale 下为每种语言创建子目录。子目录的名称可以是语言的两个字母 ISO 代码,也可以是完整的语言环境名称,如 en_US、fr_FR 等。

步骤 3

在每个语言子目录下创建单独的 default.po 文件。此文件包含 msgidmsgstr 形式的条目,如以下程序所示。

msgid "msg"
msgstr "CakePHP Internationalization example."

此处,msgid 是将在 View 模板文件中使用的键,而 msgstr 是存储翻译的值。

步骤 4

在 View 模板文件中,我们可以使用上面的 msgid,如下所示,它将根据设置的 locale 值进行翻译。

<?php echo __('msg'); ?>

可以通过以下行在 config/app.php 文件中设置默认语言环境。

'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US')

要在运行时更改本地,我们可以使用以下几行。

use Cake\I18n\I18n;
I18n::locale('de_DE');

示例

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

config/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('locale',
      ['controller'=>'Localizations','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/LocalizationsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\I18n\I18n;
   class LocalizationsController extends AppController {
      public function index() {
         if($this->request->is('post')) {
            $locale = $this->request->getData('locale');
            I18n::setLocale($locale);
         }
      }
   }
?>

在 resources\locales 下创建一个 locales 目录。在 locales 目录下创建 3 个目录,分别名为 en_US、fr_FR、de_DE。在每个目录下创建一个名为 default.po 的文件。将以下代码复制到相应的文件中。

resources/locales/en_US/default.po

msgid "msg"
msgstr "CakePHP Internationalization example."

resources/locales/fr_FR/default.po

msgid "msg"
msgstr "Exemple CakePHP internationalisation."

resources/locales/de_DE/default.po

msgid "msg"
msgstr "CakePHP Internationalisierung Beispiel."

src/Template 处创建一个目录 Localizations,并在该目录下创建一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Localizations/index.php

<?php
   echo $this->Form->create(NULL,array('url'=>'/locale'));
   echo $this->Form->radio("locale",
      [
         ['value'=>'en_US','text'=>'English'],
         ['value'=>'de_DE','text'=>'German'],
         ['value'=>'fr_FR','text'=>'French'],
      ]
   );
   echo $this->Form->button('Change Language');
   echo $this->Form->end();
?>
<?php echo __('msg'); ?>

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

输出

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

English

电子邮件

CakePHP 提供 Email 类来管理电子邮件相关功能。要在任何控制器中使用电子邮件功能,我们首先需要通过编写以下行来加载 Email 类。

use Cake\Mailer\Email;

Email 类提供了各种有用的方法,如下所述。

语法

From(string|array|null $email null, string|null $name null )

参数
  • 带有电子邮件的字符串

  • 名称

返回

array|$this

说明

指定来自哪个电子邮件地址;电子邮件将被发送

语法

To(string|array|null $emailnull, string|null $namenull)

参数
  • 带有电子邮件的字符串

  • 名称

返回

array|$this

说明

指定电子邮件将发送给谁

语法

Send(string|array|null $contentnull)

参数
  • 包含消息的字符串或包含消息的数组。

返回 array
说明

使用指定的内容、模板和布局发送电子邮件

语法

Subject(string|null $subjectnull)

参数
  • Subject 字符串

返回

array|$this

说明

获取/设置主题

语法

Attachments(string|array|null $attachmentsnull)

参数
  • 包含文件名的字符串或包含文件名的数组

返回

array|$this

说明

将附件添加到电子邮件消息

语法

Bcc(string|array|null $emailnull, string|null $namenull)

参数
  • 带有电子邮件的字符串

  • 名称

返回

array|$this

说明

Bcc

语法

cc( string|array|null $emailnull , string|null $namenull )

参数
  • 带有电子邮件的字符串

  • 名称

返回

array|$this

描述

Cc

示例

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

config/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('/email',['controller'=>'Emails','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/EmailsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Mailer\Email;
   class EmailsController extends AppController{
      public function index(){
         $email = new Email('default');
         $email->to('abc@gmail.com')
            ->subject('About')
            ->send('My message');
      }
   }
?>

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

src/Template/Emails/index.php

电子邮件已发送。

在发送任何电子邮件之前,我们需要对其进行配置。在下面的屏幕截图中,您可以看到有两种传输方式,默认和 Gmail。我们使用了 Gmail 传输方式。

您需要将"GMAIL USERNAME"替换为您的 Gmail 用户名,将"APP PASSWORD"替换为您的应用程序密码。您需要在 Gmail 中开启两步验证,并创建一个新的 APP 密码才能发送电子邮件。

config/app.php

Program App

通过访问以下 URL − http://localhost/cakephp/email 执行上述示例

输出

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

Documents Api

CakePHP - 会话管理

会话允许我们跨请求管理唯一用户,并为特定用户存储数据。会话数据可以在任何可以访问请求对象的地方访问,也就是说,会话可以从控制器、视图、助手、单元和组件访问。

访问会话对象

可以通过执行以下代码来创建会话对象。

$session = $this->request->session();

写入会话数据

要在会话中写入某些内容,我们可以使用 write() session 方法。

Session::write($key, $value)

上述方法将采用两个参数,即,值将存储在该键下。

示例

$session->write('name', 'Virat Gandhi');

读取会话数据

要从会话中检索存储的数据,我们可以使用read() session方法。

Session::read($key)

上述函数只采用一个参数,即值的键,该键在写入会话数据时使用。一旦提供了正确的键,该函数就会返回其值。

示例

$session->read('name');

当您想要检查会话中是否存在特定数据时,可以使用 check() session 方法。

Session::check($key)

上述函数将仅接受 key 作为参数。

示例

if ($session->check('name')) {
    // name 存在且不为空。
}

删除会话数据

要从会话中删除数据,我们可以使用 delete() session 方法删除数据。

Session::delete($key)

上述函数将仅获取要从会话中删除的值的键。

示例

$session->delete('name');

当您想要从会话中读取然后删除数据时,我们可以使用 consume() session 方法。

static Session::consume($key)

上述函数将仅接受 key 作为参数。

示例

$session->consume('name');

销毁会话

当用户从网站注销时,我们需要销毁用户会话,并使用 destroy() 方法销毁会话。

Session::destroy()

示例

$session->destroy();

销毁会话将从服务器中删除所有会话数据,但不会删除会话 cookie。

更新会话

在您想要更新用户会话的情况下,我们可以使用 renew() session 方法。

Session::renew()

示例

$session->renew();

完成会话

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

config/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('/session-object',['controller'=>'Sessions','action'=>'index']);
   $builder->connect('/session-read',['controller'=>'Sessions','action'=>'retrieve_session_data']);
   $builder->connect('/session-write',['controller'=>'Sessions','action'=> 'write_session_data']);
   $builder->connect('/session-check',['controller'=>'Sessions','action'=>'check_session_data']);
   $builder->connect('/session-delete',['controller'=>'Sessions','action'=>'delete_session_data']);
   $builder->connect('/session-destroy',['controller'=>'Sessions','action'=>'destroy_session_data']);
   $builder->fallbacks();
});

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

src/Controller/SessionsController.php

<?php
namespace App\Controller;
    use App\Controller\AppController;
    class SessionsController extends AppController {
    public function withdrawSessionData() {
    //创建会话对象
    $session = $this->request->getSession();
    //从会话中读取数据
    $name = $session->read('name');
    $this->set('name',$name);
    }
    public function writeSessionData(){
    //创建会话对象
    $session = $this->request->getSession();
    //在会话中写入数据
    $session->write('name','Virat Gandhi');
    }
    public function checkSessionData(){
    //创建会话对象
    $session = $this->request->getSession();
    //检查会话数据
    $name = $session->check('name');
    $address = $session->check('address');
    $this->set('name',$name);
    $this->set('address',$address);
    }
    public function deleteSessionData(){
    //创建会话对象
    $session = $this->request->getSession();
    //删除会话数据
    $session->delete('name');
    }
    public function destroySessionData(){
    //创建会话对象
    $session = $this->request->getSession();
    //销毁会话
    $session->destroy();
    }
}
?>

src/Template 下创建一个目录 Sessions,并在该目录下创建一个名为 write_session_data.phpView 文件。将以下代码复制到该文件中。

src/Template/Sessions/write_session_data.php

数据已写入会话中。

在同一个 Sessions 目录下创建另一个名为 retrieve_session_data.phpView 文件,并将以下代码复制到该文件中。

src/Template/Sessions/retrieve_session_data.php

以下是来自会话的数据。
Name: <?=$name;?>

在同一个 Sessions 目录下创建另一个名为 check_session_data.ctpView 文件,并将以下代码复制到该文件中。

src/Template/Sessions/check_session_data.ctp

<?php if($name): ?>
name exists in the session.
<?php else: ?>
name doesn't exist in the database
<?php endif;?>
<?php if($address): ?>
address exists in the session.
<?php else: ?>
address doesn't exist in the database
<?php endif;?>

在同一个 Sessions 目录下创建另一个名为 delete_session_data.ctp,View 文件,并将以下代码复制到该文件中。

src/Template/Sessions/delete_session_data.ctp

从会话中删除数据。

在同一个 Sessions 目录下创建另一个名为 destroy_session_data.ctp,View 文件,并将以下代码复制到该文件中。

src/Template/Sessions/destroy_session_data.ctp

会话已销毁。

输出

通过访问以下 URL 执行上述示例。此 URL 将帮助您在会话中写入数据。

http://localhost/cakephp4/session-write

Written in Session

访问以下 URL 读取会话数据 − http://localhost/cakephp4/session-read

Name

访问以下 URL 检查会话数据 − http://localhost/cakephp4/session-check

Name Exists

访问以下 URL 删除会话数据 − http://localhost/cakephp4/session-delete 访问

从会话中删除

访问以下 URL 销毁会话数据 − http://localhost/cakephp4/session-destroy

Destroyed

CakePHP - Cookie 管理

使用 CakePHP 处理 Cookie 既简单又安全。有一个 CookieComponent 类可用于管理 Cookie。该类提供了多种处理 Cookie 的方法。

要处理 Cookie,请将这 2 个类添加到您的控制器 −

use Cake\Http\Cookie\Cookie;
use Cake\Http\Cookie\CookieCollection;

必须先创建 cookie 对象才能注册 cookie。

$cookie = new Cookie(name,value,expiration time,path,domain);

name 和 value 是必需的,其他是可选参数。

写入 Cookie

以下是写入 cookie 的语法。

$cookie = new Cookie(name,value,expiration time,path,domain);

必须将创建的 cookie 添加到 cookieCollection,如下所示 −

$cookie = new Cookie('name','XYZ');
$cookies = new CookieCollection([$cookie]);

如果已经创建了 cookie 集合对象,则可以按如下所示添加其余的 cookie −

$cookies = $cookies->add($cookie);

读取 Cookie

要读取 Cookie,请使用 cookiecollection 中的 get() 方法。

语法

读取 Cookie 的语法如下 −

Cake\Http\Cookie\CookieCollection::get($name)

这将返回 cookiecollection 接口,要获取 Cookie 的值,您必须调用方法 getValue()。

Cake\Http\Cookie\CookieCollection 接口::getValue()

检查 Cookie

cookieCollection 中的 has() 方法将告诉您 Cookie 是否存在。

Cake\Http\Cookie\CookieCollection::has($name)

示例

echo $isPresent = $this->cookies->has('name');

删除 Cookie

remove() 方法用于删除 Cookie。以下是 remove() 方法的语法。

Cake\Http\Cookie\CookieCollection::remove($name)

remove() 方法将接受一个参数,即要删除的 Cookie 变量 ($name) 的名称。

示例 1

$test = $this->cookies->remove('name');

示例 2

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

config/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('cookie/testcookies',['controller'=>'Cookies','action'=>'testCookies']);
   $builder->fallbacks();
});

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

src/Controller/Cookies/CookiesController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Http\Cookie\Cookie;
   use Cake\Http\Cookie\CookieCollection;
   class CookiesController extends AppController{
      public $cookies;
      public function testCookies() {
         $cookie = new Cookie('name','XYZ');
         $this->cookies = new CookieCollection([$cookie]);
         $cookie_val = $this->cookies->get('name');
         $this->set('cookie_val',$cookie_val->getValue());
         $isPresent = $this->cookies->has('name');
         $this->set('isPresent',$isPresent);
         $this->set('count', $this->cookies->count());
         $test = $this->cookies->remove('name');
         $this->set('count_afterdelete', $test->count());
      }
   }
?>

src/Template 创建一个目录 Cookies,并在该目录下创建一个名为 test_cookies.phpView 文件。将以下代码复制到该文件中。

src/Template/Cookie/test_cookies.php

The value of the cookie is: <?php echo $cookie_val; ?>

<br/>
<?php
   if($isPresent):
?>
The cookie is present.
<?php
   else:
?>
The cookie isn't present.
<?php
   endif;
?>
<br/>
<?php
   echo "The count of cookie before delete is :" .$count;
?>
<br/>
<?php
   echo "The count of cookie after delete is :" .$count_afterdelete;
?>

输出

通过访问以下 URL 执行上述示例− http://localhost/cakephp4/cookie/testcookies

Cookie

CakePHP - 安全性

安全性是构建 Web 应用程序时的另一个重要功能。它向网站用户保证他们的数据是安全的。CakePHP 提供了一些工具来保护您的应用程序。

加密和解密

CakePHP 中的安全库提供了一些方法,我们可以通过这些方法加密和解密数据。以下是两种方法,它们用于相同的目的。

static Cake\Utility\Security::encrypt($text, $key, $hmacSalt = null)
static Cake\Utility\Security::decrypt($cipher, $key, $hmacSalt = null)

encrypt 方法将以文本和密钥作为参数来加密数据,返回值将是带有 HMAC 校验和的加密值。

要对数据进行哈希处理,请使用 hash() 方法。以下是 hash() 方法的语法。

static Cake\Utility\Security::hash($string, $type = NULL, $salt = false)

CSRF

CSRF 代表 跨站点请求伪造。通过启用 CSRF 组件,您可以获得针对攻击的保护。CSRF 是 Web 应用程序中常见的漏洞。

它允许攻击者捕获和重放以前的请求,有时还会使用图像标签或其他域上的资源提交数据请求。只需将 CsrfComponent 添加到您的组件数组即可启用 CSRF,如下所示 −

public function initialize(): void {
   parent::initialize();
   $this->loadComponent('Csrf');
}

CsrfComponent 与 FormHelper 无缝集成。每次使用 FormHelper 创建表单时,它都会插入一个包含 CSRF 令牌的隐藏字段。

虽然不建议这样做,但您可能希望在某些请求上禁用 CsrfComponent。您可以在 beforeFilter() 方法期间使用控制器的事件调度程序来执行此操作。

public function beforeFilter(Event $event) {
    $this->eventManager()->off($this->Csrf);
}

安全组件

安全组件为您的应用程序应用更严格的安全性。它提供用于各种任务的方法,例如 −

  • 限制您的应用程序接受哪些 HTTP 方法 −在执行副作用之前,您应始终验证所使用的 HTTP 方法。您应检查 HTTP 方法或使用 Cake\Network\Request::allowMethod() 来确保使用了正确的 HTTP 方法。

  • 表单篡改保护 − 默认情况下,SecurityComponent 会阻止用户以特定方式篡改表单。SecurityComponent 将阻止以下操作 −

    • 无法将未知字段添加到表单。

    • 无法从表单中删除字段。

    • 无法修改隐藏输入中的值。

  • 要求使用 SSL − 所有操作都需要 SSL 保护

  • 限制跨控制器通信 −我们可以限制哪些控制器可以向该控制器发送请求。我们还可以限制哪些操作可以向该控制器的操作发送请求。

示例

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

config/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('login',['controller'=>'Logins','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/LoginsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class LoginsController extends AppController {
      public function initialize() : void {
         parent::initialize();
         $this->loadComponent('Security');
      }
         public function index(){
      }
   }
?>

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

src/Template/Logins/index.php

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

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

输出

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

Submit Login

CakePHP - 验证

在制作网站时,我们经常需要在进一步处理数据之前验证某些内容。CakePHP 提供了验证包,以构建可以轻松验证数据的验证器。

验证方法

CakePHP 在验证类中提供了各种验证方法。下面列出了其中一些最受欢迎的方法。

语法

Add(string $field, array|string $name, array|Cake\Validation\ValidationRule $rule [] )

参数
  • 将添加规则的字段的名称。

  • 单个规则或多个规则数组的别名。

  • 要添加的规则

返回

$this

描述

向字段的规则集添加新规则。如果第二个参数是一个数组,那么该字段的规则列表将被第二个参数替换,并且第三个参数将被忽略。

语法

allowEmpty(string $field, boolean|string|callable $whentrue, string|null $messagenull)

参数
  • 字段的名称。

  • 指示何时允许字段为空。有效值为 true(始终)、'create'、'update'。如果传递了可调用函数,则仅当回调返回 true 时,该字段才会留空。

  • 如果字段不是,则显示的消息。

返回 $this
描述

允许字段为空。

语法

字母数字(字符串 $field、字符串|null $messagenull、字符串|callable|null $whennull)

参数
  • 要应用规则的字段。

  • 规则失败时的错误消息。

  • "create"或"update"或在应应用验证规则时返回 true 的可调用函数。

返回

$this

说明

向字段添加字母数字规则。

语法

creditCard(string $field , string $type'all', string|null $messagenull, string|callable|null $whennull)

参数
  • 要将规则应用于。

  • 您要允许的卡类型。默认为"全部"。您还可以提供一个可接受的卡类型数组,例如 ['mastercard', 'visa', 'amex']。

  • 规则失败时的错误消息。

  • 当应应用验证规则时,可以是 'create' 或 'update' 或返回 true 的可调用函数。

返回

$this

说明

向字段添加信用卡规则。

语法

Email(string $field , boolean $checkMXfalse, string|null $messagenull, string|callable|null, $whennull)

参数
  • 要应用规则的字段。

  • 是否检查 MX 记录。

  • 规则失败时的错误消息。

  • 当应应用验证规则时,可以是"create"或"update"或返回 true 的可调用函数。

返回

$this

描述

向字段添加电子邮件验证规则。

语法

maxLength(string $field, integer $max, string|null $messagenull, string|callable|null $whennull)

参数
  • 要应用规则的字段。

  • 允许的最大长度。

  • 规则失败时的错误消息。

  • 当验证规则应该返回 true 时,可以是 'create''update'callable应用。

返回

$this

说明

向字段添加字符串长度验证规则。

语法

minLength(string $field, integer $min, string|null $messagenull, string|callable|null $whennull)

参数
  • 要应用规则的字段。

  • 允许的最大长度。

  • 规则失败时的错误消息。

  • 'create''update'callable,当应应用验证规则时返回 true。

返回

$this

描述

向字段添加字符串长度验证规则。

语法

notBlank(string $field, string|null $messagenull, string|callable|null $whennull)

参数
  • 要应用规则的字段。

  • 规则失败时的错误消息。

  • 当应应用验证规则时,'create''update' 或返回 true 的 callable

返回

$this

描述

向字段添加 notBlank 规则。

CakePHP - 创建验证器

可以通过在控制器中添加以下两行来创建验证器。

use Cake\Validation\Validator;
$validator = new Validator();

验证数据

一旦我们创建了验证器,我们就可以使用验证器对象来验证数据。以下代码解释了如何验证登录网页的数据。

$validator->notEmpty('username', 'We need username.')->add(
   'username', 'validFormat', ['rule' => 'email','message' => 'E-mail must be valid']);

$validator->notEmpty('password', 'We need password.');
$errors = $validator->errors($this->request->data());

使用 $validator 对象,我们首先调用 notEmpty() 方法,这将确保用户名不能为空。之后,我们链接 add() 方法来添加另一个验证以确保电子邮件格式正确。

之后,我们使用 notEmpty() 方法为密码字段添加验证,这将确认密码字段不能为空。

示例

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

config/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('validation',['controller'=>'Valids','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/ValidsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Validation\Validator;
   class ValidsController extends AppController{
      public function index(){
         $validator = new Validator();
         $validator->notEmpty('username', 'We need username.')->add(
            'username', 'validFormat', ['rule' => 'email','message' => 'E-mail must be valid']);
         $validator->notEmpty('password', 'We need password.');
         $errors = $validator->errors($this->request->getData());
         $this->set('errors',$errors);
      }
   }
?>

src/Template 处创建一个目录 Valids,并在该目录下创建一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Valids/index.php

<?php
   if($errors) {
      foreach($errors as $error)
      foreach($error as $msg)
      echo '<font color="red">'.$msg.'</font><br>';
   } else {
      echo "No errors.";
   }
   echo $this->Form->create(NULL,array('url'=>'/validation'));
   echo $this->Form->control('username');
   echo $this->Form->control('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

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

http://localhost/cakephp4/validation

输出

单击提交按钮,无需输入任何内容。您将收到以下输出。

Click PHP

Http - 客户端

http 客户端可用于发出 GET、POST、PUT 等请求。

要使用 http 客户端,请添加以下 −

use Cake\Http\Client;

让我们通过示例来了解 HTTP 客户端的工作原理。

HTTP GET 方法

要从给定的 http url 获取数据,您可以执行以下操作 −

$response = $http->get('https://jsonplaceholder.typicode.com/users');

如果您需要传递一些查询参数,可以按如下方式传递它们 −

$response = $http->get('https://jsonplaceholder.typicode.com/users', ["id", 1]);

要获取响应,您可以按如下方式 −

对于普通文本数据

$response->getBody();

对于 Json

$response->getJson();

对于 Xml

$response->getXml()

示例

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

config/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('getData',['controller'=>'Requests','action'=>'index']);
   $builder->fallbacks();
});

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

src/Controller/RequestsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Http\Client;
   class RequestsController extends AppController{
      public function index(){
         $http = new Client();
         $response = $http->get('https://jsonplaceholder.typicode.com/users');
         $stream = $response->getJson();
         $this->set('response',$stream);
      }
   }
?>

src/Template 处创建一个目录 Requests,并在该目录下创建一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Requests/index.php

<h3>All Users from url : https://jsonplaceholder.typicode.com/users</h3>
<?php
   if($response) {
      foreach($response as $res => $val) {
         echo '<font color="gray">Name: '.$val["name"].' Email -'.$val["email"].'</font><br>';
      }
   }
?>

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

http://localhost/cakephp4/getData

输出

单击提交按钮,无需输入任何内容。您将收到以下输出。

用户 URL

HTTP POST 方法

要使用 post,您需要按如下方式调用 $http 客户端 −

$response = $http->post('yoururl', data);

让我们看一个同样的例子。

示例

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

config/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('postData',['controller'=>'Requests','action'=>'index']);
   $builder->fallbacks();
});

src/Controller/RequestsController.php 处创建一个 RequestsController.php 文件。将以下代码复制到控制器文件中。如果已创建,请忽略。

src/Controller/RequestsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Http\Client;
   class RequestsController extends AppController{
      public function index(){
         $http = new Client();
         $response = $http->post('https://postman-echo.com/post', [
            'name'=> 'ABC',
            'email' => 'xyz@gmail.com'
         ]);
      }
   }
?>

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

src/Template/Requests/index.php

<h3>测试 Post 方法</h3>

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

http://localhost/cakephp4/postData

输出

下面给出了代码的输出 −

Post Method

同样,您可以尝试 PUT 方法。

$http = new Client();
$response = $http->put('https://postman-echo.com/post', [
   'name'=> 'ABC',
   'email' => 'xyz@gmail.com'
]);

CakePHP - 分页

如果我们想要显示一组庞大的数据,我们可以使用分页,这个功能在 Cake PHP 4 中可用,非常容易使用。

我们有一个名为"articles"的表格,其中包含以下数据 −

Options

让我们使用分页以页面的形式显示数据,而不是将它们全部显示在一起。

示例

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

config/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('posts',['controller'=>'Posts','action'=>'index']);
   $builder->fallbacks();
});

src/Controller/PostsController.php 处创建一个 PostsController.php 文件。将以下代码复制到控制器文件中。如果已创建,请忽略。

src/Controller/PostsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class PostsController extends AppController {
      public function index(){
         $this->loadModel('articles');
         $articles = $this->articles->find('all')->order(['articles.id ASC']);
         $this->set('articles', $this->paginate($articles, ['limit'=> '3']));
      }
   }
?>

使用 − 获取 articles 表中的数据

$this->loadModel('articles');
$articles = $this->articles->find('all')->order(['articles.id ASC']);

要应用分页,我们将显示每条记录 3 条数据,操作如下 −

$this->set('articles', $this->paginate($articles, ['limit'=> '3']));

这足以激活 articles 表上的分页。

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

src/Template/Posts/index.php

<div>
<?php foreach ($articles as $key=>$article) {?>
<a href="#">
   <div>
   <p><?= $article->title ?> </p>
   <p><?= $article->details ?></p>
   </div>
</a>
<br/>
<?php
}
?>
<ul class="pagination">
<?= $this->Paginator->prev("<<") ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(">>") ?>
</ul>
</div>

页面列表的分页如下 −

<ul class="pagination">
<?= $this->Paginator->prev("<<") ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(">>") ?>
</ul>

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

http://localhost/cakephp4/posts

输出

运行代码时,您将看到以下输出 −

Article

单击下面的数字,切换到下一页,或使用下一个或上一个按钮。

例如

Article1

您将看到 page=2 附加到浏览器中的页面 URL。

CakePHP - 日期和时间

要在 cakephp4 中使用日期和时间,我们将使用可用的 FrozenTime类。

要使用日期和时间,请将该类包含在控制器中

use Cake\I18n\FrozenTime;

让我们使用 FrozenTime 类来举例并显示日期和时间。

示例

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

config/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('datetime',['controller'=>'Dates','action'=>'index']);
   $builder->fallbacks();
});

src/Controller/DatesController.php 处创建一个 DatesController.php 文件。将以下代码复制到控制器文件中。如果已创建,请忽略。

src/Controller/DatesController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\I18n\FrozenTime;
   class DatesController extends AppController{
      public function index(){
         $time = FrozenTime::now();
         $now = FrozenTime::parse('now');
         $_now = $now->i18nFormat('yyyy-MM-dd HH:mm:ss');
         $this->set('timenow', $_now);
         $now = FrozenTime::parse('now');
         $nice = $now->nice();
         $this->set('nicetime', $nice);
         $hebrewdate = $now->i18nFormat(\IntlDateFormatter::FULL, null, 'en-IR@calendar=hebrew');
         $this->set("hebrewdate",$hebrewdate);
         $japanesedate = $now->i18nFormat(\IntlDateFormatter::FULL, null, 'en-IR@calendar=japanese');
         $this->set("japanesedate",$japanesedate);
         $time = FrozenTime::now();
         $this->set("current_year",$time->year);
         $this->set("current_month",$time->month);
         $this->set("current_day",$time->day);
      }
   }
?>

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

src/Template/Dates/index.php

<?php
   echo "The Current date and time is = ".$timenow;
   echo "<br/>";
   echo "Using nice format available = ".$nicetime;
   echo "<br/>";
   echo "Date and Time as per Hebrew Calender =" .$hebrewdate;
   echo "<br/>";
   echo "Date and Time as per Japanese Calender =" .$japanesedate;
   echo "<br/>";
   echo "Current Year = ".$current_year;
   echo "<br/>";
   echo "Current Month = ".$current_month;
   echo "<br/>";
   echo "Current Day = ".$current_day;
?>

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

http://localhost/cakephp4/datetime

输出

运行代码时,您将看到以下输出 −

当前日期

CakePHP - 文件上传

要进行文件上传,我们将使用表单助手。以下是文件上传的示例。

示例

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

config/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('fileupload',['controller'=>'Files','action'=>'index']);
   $builder->fallbacks();
});

src/Controller/FilesController.php 处创建一个 FilesController.php 文件。将以下代码复制到控制器文件中。如果已创建,请忽略。

在 src/ 中创建 uploads/ 目录。上传的文件将保存在 uploads/ 文件夹中。

src/Controller/FilesController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\View\Helper\FormHelper;
   class FilesController extends AppController {
      public function index(){
         if ($this->request->is('post')) {
            $fileobject = $this->request->getData('submittedfile');
            $uploadPath = '../uploads/';
            $destination = $uploadPath.$fileobject->getClientFilename();
            // Existing files with the same name will be replaced.
            $fileobject->moveTo($destination);
         }
      }
   }
?>

src/Template 处创建一个目录 Files,并在该目录下创建一个名为 index.phpView 文件。将以下代码复制到该文件中。

src/Template/Files/index.php

<?php
   echo $this->Form->create(NULL, ['type' => 'file']);
   echo $this->l;Form->file('submittedfile');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
   $uploadPath ='../uploads/';
   $files = scandir($uploadPath, 0);
   echo "Files uploaded in uploads/ are:<br/>";
   for($i = 2; $i < count($files); $i++)
      echo "File is - ".$files[$i]."<br>";
?>

将为用户列出 uploads/ 文件夹中保存的文件。通过访问以下 URL − 执行上述示例

http://localhost/cakephp4/fileupload −

输出

执行上述代码时,您应该会看到以下输出 −

Choose File