- CakePHP 教程
- CakePHP - 首页
- CakePHP - 概述
- CakePHP - 安装
- CakePHP - 文件夹结构
- CakePHP - 项目配置
- CakePHP - 路由
- CakePHP - 控制器
- CakePHP - 视图
- CakePHP - 扩展视图
- CakePHP - 视图元素
- CakePHP - 视图事件
- CakePHP - 数据库操作
- CakePHP - 查看记录
- CakePHP - 更新记录
- CakePHP - 删除记录
- CakePHP - 服务
- CakePHP - 错误和异常处理
- CakePHP - 日志记录
- CakePHP - 表单处理
- CakePHP - 国际化
- CakePHP - 会话管理
- CakePHP - Cookie 管理
- CakePHP - 安全性
- CakePHP - 验证
- CakePHP - 创建验证器
- CakePHP - 分页
- CakePHP - 日期和时间
- CakePHP - 文件上传
- CakePHP 有用资源
- CakePHP 快速指南
- CakePHP - 有用资源
- CakePHP - 讨论
CakePHP 快速指南
CakePHP - 概述
CakePHP是一个开源的MVC框架。它使开发、部署和维护应用程序更容易。CakePHP拥有一些库来减少大多数常见任务的负担。
CakePHP 的优点
使用 CakePHP 的优点如下:
开源
MVC 框架
模板引擎
缓存操作
搜索引擎友好的 URL
简单的 CRUD(创建、读取、更新、删除)数据库交互。
库和助手
内置验证
本地化
电子邮件、Cookie、安全、会话和请求处理组件
用于 AJAX、JavaScript、HTML 表单等的视图助手
CakePHP 请求周期
下图描述了 CakePHP 中请求生命周期的工作方式:
典型的 CakePHP 请求周期从用户请求应用程序中的页面或资源开始。在高层次上,每个请求都经过以下步骤:
Web 服务器重写规则将请求定向到 webroot/index.php。
执行应用程序的自动加载器和引导文件。
任何已配置的调度过滤器都可以处理请求,并可以选择生成响应。
调度程序根据路由规则选择合适的控制器和操作。
调用控制器的操作,控制器与所需的模型和组件交互。
控制器将响应创建委托给视图以生成模型数据产生的输出。
视图使用助手和单元生成响应正文和标头。
响应被发送回客户端。
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 的安装方法。
安装 Composer
访问 Composer 网站 https://getcomposer.org.cn/download/,根据您的计算机操作系统 (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 在浏览器中打开您的项目。
路径为 https://127.0.0.1/cakephp。
CakePHP - 文件夹结构
在这里,我们将学习 CakePHP 中的文件夹结构和命名约定。让我们首先了解文件夹结构。
文件夹结构
请查看以下屏幕截图。它显示了 CakePHP 的文件夹结构。
下表描述了 CakePHP 中每个文件夹的作用:
序号 | 文件夹名称和描述 |
---|---|
1 | bin bin 文件夹包含 Cake 控制台可执行文件。 |
2 | config config 文件夹包含 CakePHP 使用的(少量)配置文件。数据库连接详细信息、引导程序、核心配置文件等都应存储在此处。 |
3 | logs logs 文件夹通常包含您的日志文件,具体取决于您的日志配置。 |
4 | plugins plugins 文件夹用于存储应用程序使用的插件。 |
5 | resources 各个语言环境文件夹中的国际化文件将存储在此处。例如 locales/en_US。 |
6 | src src 文件夹是您施展魔法的地方。这是您的应用程序文件将被放置的地方,您将在这里进行大部分应用程序开发。让我们更仔细地看看 src 内部的文件夹。
|
7 | templates Template 此处放置演示文件:元素、错误页面、布局和视图模板文件。 |
8 | tests tests 文件夹是您放置应用程序测试用例的地方。 |
9 | tmp tmp 文件夹是 CakePHP 存储临时数据的地方。它实际存储的数据取决于您如何配置 CakePHP,但此文件夹通常用于存储模型描述以及有时存储会话信息。 |
10 | vendor vendor 文件夹是安装 CakePHP 和其他应用程序依赖项的地方。请承诺不要编辑此文件夹中的文件。如果您修改了核心,我们将无法帮助您。 |
11 | webroot webroot 目录是应用程序的公共文档根目录。它包含所有您希望公开访问的文件。 |
命名约定
命名约定并非强制遵守,但它是一种良好的编码实践,并且随着项目规模的扩大将非常有用。
控制器约定
控制器类名必须是复数、帕斯卡命名法,并且名称必须以 Controller 结尾。例如,对于 Students 类,控制器的名称可以是StudentsController。控制器上的公共方法通常作为可通过 Web 浏览器访问的“操作”公开。
例如,/users/view 默认情况下映射到 UsersController 的view()方法。受保护或私有方法无法通过路由访问。
文件和类名约定
大多数情况下,我们看到我们的类名和文件名几乎相同。CakePHP 中也是如此。
例如,StudentsController 类将具有名为 StudentsController.php 的文件。文件必须保存为模块名称,并保存在 app 文件夹中的相应文件夹中。
数据库约定
用于 CakePHP 模型的表,大多数情况下名称为复数且带下划线。
例如,student_details、student_marks。如果字段名由两个单词组成,则使用下划线,例如 first_name、last_name。
模型约定
对于模型,类名根据数据库表命名,名称为复数、帕斯卡命名法,并以 Table 结尾。
例如,StudentDetailsTable、StudentMarksTable
视图约定
对于视图模板,文件基于控制器函数。
例如,如果 StudentDetailsController 类具有 showAll() 函数,则视图模板将命名为 show_all.php 并保存在 template/yrmodule/show_all.php 中。
CakePHP - 项目配置
本章将了解 CakePHP 中的环境变量、常规配置、数据库配置和电子邮件配置。
配置CakePHP 默认情况下带有一个配置文件,我们可以根据需要修改它。为此专门有一个文件夹“config”。CakePHP 提供了不同的配置选项。
让我们首先了解 CakePHP 中的环境变量。
环境变量
环境变量使您的应用程序在不同的环境中更容易工作。例如,在开发服务器、测试服务器、暂存服务器和生产服务器环境中。对于所有这些环境,您可以使用env() 函数读取您需要的环境配置并构建您的应用程序。
在您的 config 文件夹中,您会看到 config/.env.example。此文件包含所有将根据您的环境更改的变量。首先,您可以在 config 文件夹中创建一个文件,即 config/.env,并定义这些变量并使用它们。如果您需要任何其他变量,它可以放在该文件中。
您可以使用 env() 函数读取您的环境变量,如下所示:
示例
$debug = env('APP_DEBUG', false);
第一个是您想要的环境变量的名称,第二个值是默认值。如果找不到环境变量的值,则使用默认值。
常规配置
下表描述了各种变量的作用以及它们如何影响您的 CakePHP 应用程序。
序号 | 变量名称和描述 |
---|---|
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、图像)的末尾。有效值为:
|
数据库配置
数据库可以在 **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** 中的每个参数。
主机 | 数据库服务器的主机名(或 IP 地址)。 |
---|---|
用户名 | 数据库用户名 |
密码 | 数据库密码。 |
数据库 | 数据库名称。 |
端口 | 用于连接服务器的 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** 中的每个参数。
序号 | 键值 & 描述 |
---|---|
1 | 类名 表示与数据库服务器连接的类的完全命名空间类名。此类负责加载数据库驱动程序,提供 SQL 事务机制和准备 SQL 语句等。 |
2 | 驱动程序 用于实现数据库引擎所有特性的驱动程序类名。这可以是使用插件语法的简短类名、完全命名空间名称或构造的驱动程序实例。简短类名的示例包括 Mysql、Sqlite、Postgres 和 Sqlserver。 |
3 | 持久连接 是否使用与数据库的持久连接。 |
4 | 编码 指示在向服务器发送 SQL 语句时使用的字符集,例如“utf8”等。 |
5 | 时区 要设置的服务器时区。 |
6 | 初始化 创建连接时应发送到数据库服务器的查询列表。 |
7 | 日志 设置为 true 以启用查询日志记录。启用后,查询将在调试级别使用 queriesLog 范围记录。 |
8 | 引用标识符 如果在表名或列名中使用保留字或特殊字符,则设置为 true。启用此设置将导致使用查询生成器构建的查询在创建 SQL 时引用标识符。它会降低性能。 |
9 | 标志 应传递给底层 PDO 实例的 PDO 常量的关联数组。 |
10 | 缓存元数据 布尔值 true 或包含用于存储元数据的缓存配置的字符串。不建议禁用元数据缓存,这可能会导致性能非常差。 |
电子邮件配置
可以在 **config/app.php** 文件中配置电子邮件。无需在 config/app.php 中定义电子邮件配置。无需配置即可使用电子邮件。只需使用相应的方法分别设置所有配置或加载配置数组即可。电子邮件默认配置使用 **config()** 和 **configTransport()** 创建。
电子邮件配置传输
通过将传输与投递配置文件分开定义,可以轻松地在多个配置文件中重用传输配置。可以为生产、开发和测试指定多个配置。每个传输都需要一个 className。有效选项如下:
**Mail** - 使用 PHP mail 函数发送
**Smtp** - 使用 SMTP 发送
**Debug** - 不发送电子邮件,只返回结果
可以通过将相应的文件添加到 **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 传递到控制器的操作,如何生成 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** 文件。
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) { // 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/Template/Tests/show.php
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
通过访问以下 URL(位于 https://127.0.0.1/cakephp4/)来执行上述示例。
输出
上述 URL 将产生以下输出。
传递的参数
传递的参数是在 URL 中传递的参数。这些参数可以传递到控制器的操作。这些传递的参数可以通过三种方式传递给您的控制器。
作为操作方法的参数
以下示例显示了如何将参数传递到控制器的操作。访问以下 URL:https://127.0.0.1/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) { // 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/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 https://127.0.0.1/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** 文件。
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) { // 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** 下创建一个名为 **Generates** 的文件夹,并在该文件夹下创建一个名为 show.php 的 **视图** 文件。将以下代码复制到该文件中。
src/Template/Generates/show.php
<h1>This is CakePHP tutorial and this is an example of Generating URLs<h1>
通过访问以下 URL 来执行上述示例:
https://127.0.0.1/cakephp4/generate
输出
上述 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) { // 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** - https://127.0.0.1/cakephp4/generate
URL 1 的输出
**URL 2** - https://127.0.0.1/cakephp4/redirect
URL 2 的输出
您将被重定向到 https://tutorialspoint.com
CakePHP - 控制器
控制器顾名思义控制应用程序。它充当模型和视图之间的桥梁。控制器处理请求数据,确保调用正确的模型并呈现正确的响应或视图。
控制器类中的方法称为**操作**。每个控制器都遵循命名约定。控制器类名采用复数形式、驼峰式大小写,并以 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) { // Action logic goes here. } public function share($customerId, $recipeId) { // Action logic goes here. } public function search($query) { // Action logic goes here. } }
如上例所示,**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) { // 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/Template/Redirects/action1.php
<h1>This is an example of how to redirect within controller.</h1>
通过访问以下 URL 来执行上述示例。
https://127.0.0.1/cakephp4/redirect-controller
输出
执行后,您将收到以下输出。
现在,访问以下 URL:https://127.0.0.1/cakephp4/redirect-controller2
上述 URL 将提供以下输出。
加载模型
在 CakePHP 中,可以使用 **loadModel()** 方法加载模型。以下是 **loadModel()** 方法的语法:
Cake\Controller\Controller::loadModel(string $modelClass, string $type)
该函数有两个参数,如下所示:
第一个参数是模型类的名称。
第二个参数是要加载的存储库类型。
示例
如果要在控制器中加载 Articles 模型,可以在控制器的 action 中写入以下代码:
$this->loadModel('Articles');
CakePHP - 视图
MVC 中的字母“V”代表视图(Views)。视图负责根据请求向用户发送输出。**视图类**是加速开发过程的一种有效方法。
视图模板
CakePHP 的视图模板文件从控制器获取数据,然后呈现输出,以便将其正确显示给用户。我们可以在模板中使用变量和各种控制结构。
模板文件存储在 **src/Template/** 目录下,位于使用这些文件的控制器的同名目录中,并以其对应的 action 命名。例如,Products 控制器“view()” action 的**视图**文件通常位于 src/Template/Products/view.php。
简而言之,控制器的名称 (ProductsController) 与文件夹的名称 (Products) 相同,只是去掉了 Controller 字样;控制器的 action/方法名称 (view()) 与视图文件名称 (view.php) 相同。
视图变量
视图变量是从控制器获取值的变量。我们可以在视图模板中使用任意数量的变量。我们可以使用 **set()** 方法将值传递给视图中的变量。这些设置的变量在视图和 action 呈现的布局中都可用。以下是 **set()** 方法的语法:
Cake\View\View::set(string $var, mixed $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) { // 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 来执行上述示例。
https://127.0.0.1/cakephp4/template
输出
上述 URL 将产生以下输出。
CakePHP - 扩展视图
在制作网页时,我们常常需要在其他页面中重复某些页面部分。CakePHP 提供了这样的功能,允许在一个视图中扩展另一个视图,而无需重复代码。
**extend()** 方法用于在**视图**文件中扩展视图。此方法接受一个参数,即带有路径的视图文件的名称。在提供视图文件的名称时,不要使用扩展名 .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 的**视图**文件。将以下代码复制到该文件中。
src/Template/Extends/header.php
<div align="center"> <h1>Common Header</h1> </div> <?= $this->fetch('content') ?>
在 **Extends** 目录下创建另一个名为 **index.php** 的**视图**文件。将以下代码复制到该文件中。在这里,我们正在扩展上面的视图 **header.php**。
src/Template/Extends/index.php
<?php $this->extend('header'); ?> This is an example of extending view.
访问以下 URL https://127.0.0.1/cakephp4/extend 执行上述示例。
输出
执行后,您将收到以下输出。
CakePHP - 视图元素
网页的某些部分在多个网页上重复出现,但在不同的位置。CakePHP 可以帮助我们重用这些重复的部分。这些可重用的部分称为**元素 - 帮助框、额外菜单**等。元素基本上是一个**迷你视图**。我们也可以在元素中传递变量。
Cake\View\View::element(string $elementPath, array $data, array $options =[]
上述函数有三个参数,如下所示:
第一个参数是 **src/Template/element/** 文件夹中模板文件的名称。
第二个参数是要提供给呈现视图的数据数组。
第三个参数用于选项数组,例如缓存。
在三个参数中,第一个是必需的,其余是可选的。
示例
在 **src/Template/element** 目录下创建一个名为 **helloworld.php** 的元素文件。将以下代码复制到该文件中。
src/Template/element/helloworld.php
<p>Hello World</p>
在 **src/Template** 目录下创建一个名为 **Elems** 的文件夹,并在该目录下创建一个名为 index.php 的**视图**文件。将以下代码复制到该文件中。
src/Template/Elems/index.php
Element Example: <?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 https://127.0.0.1/cakephp4/element-example 执行上述示例。
输出
执行后,上述 URL 将给出以下输出。
CakePHP - 视图事件
我们可以使用视图事件使用多个回调/事件。这些事件有助于在某些事情发生之前或之后执行多项任务。以下是可用于 CakePHP 的回调列表:
序号 | 事件函数和说明 |
---|---|
1 | Helper::beforeRender(Event $event,$viewFile) **beforeRender** 方法在控制器的 beforeRender 方法之后但控制器呈现**视图**和**布局**之前调用。这将接收正在呈现的文件作为参数。 |
2 | Helper::beforeRenderFile(Event $event, $viewFile) 此方法在呈现每个视图文件之前调用。这包括**元素、视图、父视图**和**布局**。 |
3 | Helper::afterRenderFile(Event $event, $viewFile, $content) 此方法在呈现每个视图文件之后调用。这包括**元素、视图、父视图**和**布局**。回调可以修改并返回**$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',
您可以根据自己的选择更改详细信息,即主机、用户名、密码和数据库。
完成后,请确保它已在 config/app_local.php 的 Datasources 对象中更新。
现在,我们将继续使用上述详细信息,转到您的 phpmyadmin 或 mysql 数据库,并创建名为 my_app 的用户,如下所示:
授予必要的权限并保存。现在,我们根据 app_local.php 中提到的配置拥有数据库详细信息。当您检查 CakePHP 首页时,您应该会看到以下内容:
现在,我们将在数据库中创建以下 users 表。
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 的**视图**文件。将以下代码复制到该文件中。
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 https://127.0.0.1/cakephp4/users/add 执行上述示例。
输出
执行后,您将收到以下输出。
数据将保存到 users 表中,如下所示:
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.php** 的**视图**文件。将以下代码复制到该文件中。
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 https://127.0.0.1/cakephp4/users 执行上述示例。
输出
执行后,上述 URL 将给出以下输出。
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.php** 的**视图**文件,并将以下代码复制到其中。
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 并单击**编辑链接**以编辑记录来执行上述示例。
https://127.0.0.1/cakephp4/users
输出
访问上述 URL 后,它将显示 users 表中的记录,如下所示:
单击“编辑”按钮,将显示以下屏幕:
现在,我们将名称 Virat 更新为 Virat123 并提交详细信息。显示的下一个屏幕如下所示:
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.ctp的View文件。将以下代码复制到该文件中。
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并单击删除链接来删除记录,以执行上述示例。
https://127.0.0.1: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.php的View文件。将以下代码复制到该文件中。
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.php的View文件。将以下代码复制到该文件中。
src/Template/Authexs/logout.php
You are successfully logged out.
创建另一个名为index.php的View文件。将以下代码复制到该文件中。
src/Template/Authexs/index.php
You are successfully logged in. <?php echo $this->Html->link('logout',[ "controller" => "Authexs","action" => "logout" ]); ?>
通过访问以下 URL 来执行上述示例。
https://127.0.0.1/cakephp4/auth
输出
由于已实现身份验证,因此当您尝试访问上述URL时,您将被重定向到如下所示的登录页面。
提供正确的凭据后,您将登录并重定向到如下所示的屏幕。
单击注销链接后,您将再次被重定向到登录屏幕。
CakePHP - 错误和异常处理
为了系统的顺利运行,需要有效地处理系统的故障。CakePHP带有默认的错误陷阱,它会在错误发生时打印和记录错误。相同的错误处理程序用于捕获异常。
当debug为true时,错误处理程序显示错误,当debug为false时,错误处理程序记录错误。CakePHP有很多异常类,内置的异常处理将捕获任何未捕获的异常并呈现有用的页面。
错误和异常配置
错误和异常可以在config\app.php文件中配置。错误处理接受一些选项,允许您为您的应用程序定制错误处理 -
选项 | 数据类型 | 描述 |
---|---|---|
errorLevel | int | 您感兴趣的捕获错误的级别。使用内置的php错误常量和位掩码来选择您感兴趣的错误级别。 |
trace | bool | 在日志文件中包含错误的堆栈跟踪。堆栈跟踪将在每个错误后包含在日志中。这有助于查找错误的发生位置/时间。 |
exceptionRenderer | string | 负责呈现未捕获异常的类。如果您选择一个自定义类,则应将该类的文件放在src/Error中。此类需要实现一个render()方法。 |
日志 | 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
This is CakePHP tutorial and this is an example of Passed arguments.
Argument-1: <?=$argument1?><br/> Argument-2: <?=$argument2?><br/>
通过访问以下 URL 来执行上述示例。
https://127.0.0.1/cakephp4/exception/5/0
输出
执行后,您将收到以下输出。
CakePHP - 日志记录
在CakePHP中进行日志记录是一项非常简单的任务。您只需要使用一个函数。您可以记录错误、异常、用户活动、用户采取的操作以及任何后台进程(如cronjob)。在CakePHP中记录数据很容易。log()函数由LogTrait提供,LogTrait几乎是所有CakePHP类的共同祖先。
日志记录配置
我们可以在config/app.php文件中配置日志。该文件中有一个日志部分,您可以在其中配置日志记录选项,如下面的屏幕截图所示。
默认情况下,您将看到已经为您配置的两个日志级别 - error 和 debug。每个级别都将处理不同级别的消息。
CakePHP支持各种日志记录级别,如下所示:
Emergency − 系统无法使用
Alert − 必须立即采取行动
Critical − 严重情况
Error − 错误情况
Warning − 警告情况
Notice − 正常但重要的条件
Info − 信息消息
Debug − 调试级别消息
写入日志文件
我们可以通过两种方式向日志文件写入内容。
第一种是使用静态write()方法。以下是静态write()方法的语法。
语法 | write( integer|string $level, mixed $message, string|array $context [] ) |
---|---|
参数 |
正在写入的消息的严重级别。该值必须是整数或与已知级别匹配的字符串。 要记录的消息内容。 用于记录消息的其他数据。可以传递特殊的范围键以用于进一步过滤要使用的日志引擎。如果传递字符串或数字索引数组,则将被视为范围键。有关日志范围的更多信息,请参见Cake\Log\Log::config()。 |
返回值 | boolean |
描述 | 将给定的消息和类型写入所有已配置的日志适配器。已配置的适配器同时传递$level和$message变量。$level是以下字符串/值之一。 |
第二种是使用任何使用LogTrait的log()快捷方式函数。调用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
Something is written in log file. Check log file logs\debug.log
通过访问以下 URL 来执行上述示例。
https://127.0.0.1/cakephp4/logex
输出
执行后,您将收到以下输出。
日志将添加到log/debug.log文件中 -
CakePHP - 表单处理
CakePHP提供各种内置标签来轻松安全地处理HTML表单。与许多其他PHP框架一样,HTML的主要元素也是使用CakePHP生成的。以下是用于生成HTML元素的各种函数。
以下函数用于生成选择选项 -
语法 | _selectOptions( array $elementsarray(), array $parentsarray(), boolean $showParentsnull, array $attributesarray() ) |
---|---|
参数 |
|
返回值 | array |
描述 | 返回格式化的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按钮标签。 |
描述 | 创建一个<button>标签。type属性默认为type="submit"。您可以使用$options['type']将其更改为不同的值。 |
以下函数用于在HTML页面上生成复选框。
语法 | Checkbox(string $fieldName, array $optionsarray() ) |
---|---|
参数 |
|
返回值 | HTML文本输入元素。 |
描述 | 创建一个复选框输入控件。 |
以下函数用于在HTML页面上创建表单。
语法 | create( mixed $modelnull , array $optionsarray() ) |
---|---|
参数 |
|
返回值 | 格式化的FORM起始标签。 |
描述 | 返回HTML FORM元素。 |
以下函数用于在HTML页面上提供文件上传功能。
语法 | file(string $fieldName, array $optionsarray() ) |
---|---|
参数 |
|
返回值 | 生成的file输入。 |
描述 | 创建文件输入控件。 |
以下函数用于在HTML页面上创建隐藏元素。
语法 | hidden( string $fieldName , array $optionsarray() ) |
---|---|
参数 |
|
返回值 | 生成的隐藏输入 |
描述 | 创建一个隐藏输入字段 |
以下函数用于在HTML页面上生成输入元素。
语法 | Input(string $fieldName , array $options array() ) |
---|---|
参数 |
|
返回值 | 完整的表单控件 |
描述 | 生成一个包含标签和包装div的表单输入元素 |
以下函数用于在HTML页面上生成单选按钮。
语法 | Radio(string $fieldName , array $optionsarray() , array $attributesarray() ) |
---|---|
参数 |
|
返回值 | 完整的单选控件集 |
描述 | 创建一组单选控件。默认情况下将创建图例和字段集。使用$options控制此操作。 |
以下函数用于在HTML页面上生成提交按钮。
语法 | Submit(string $caption null, array $options array() ) |
---|---|
参数 |
|
返回值 | HTML提交按钮 |
描述 | 创建一个提交按钮元素。此方法将生成<input />元素,可以使用$options提交和重置表单。可以通过为$caption提供图像路径来创建图像提交。 |
以下函数用于在HTML页面上生成textarea元素。
语法 | Textarea(string $fieldName , array $options array() ) |
---|---|
参数 |
|
返回值 | 生成的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(); });
在以下位置创建一个**RegistrationsController.php**文件:
**src/Controller/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.php**的**View**文件。将以下代码复制到该文件中。
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 来执行上述示例:
https://127.0.0.1/cakephp4/register
输出
执行后,您将收到以下输出。
CakePHP - 国际化
像许多其他框架一样,CakePHP也支持国际化。我们需要遵循以下步骤才能从单一语言过渡到多种语言。
步骤 1
创建一个单独的语言环境目录resources\**locales**。
步骤 2
在src\Locale目录下为每种语言创建子目录。子目录的名称可以是语言的两位字母ISO代码或完整的语言环境名称,例如en_US、fr_FR等。
步骤 3
在每个语言子目录下创建一个单独的**default.po**文件。此文件包含以**msgid**和**msgstr**形式的条目,如下面的程序所示。
msgid "msg" msgstr "CakePHP Internationalization example."
这里,**msgid**是将在View模板文件中使用的键,**msgstr**是存储翻译的值。
步骤 4
在View模板文件中,我们可以使用上面的**msgid**,如下所示,它将根据语言环境的设置值进行翻译。
<?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.php**的**View**文件。将以下代码复制到该文件中。
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来执行上述示例。https://127.0.0.1/cakephp4/locale
输出
执行后,您将收到以下输出。
电子邮件
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) |
---|---|
参数 |
|
返回值 | array|$this |
描述 | 获取/设置主题 |
语法 | Attachments(string|array|null $attachmentsnull) |
---|---|
参数 |
|
返回值 | array|$this |
描述 | 向电子邮件消息添加附件 |
语法 | Bcc(string|array|null $emailnull, string|null $namenull) |
---|---|
参数 |
|
返回值 | array|$this |
描述 | 密件抄送 |
语法 | cc( string|array|null $emailnull , string|null $namenull ) |
---|---|
参数 |
|
返回值 | array|$this |
描述 | 抄送 |
示例
按以下程序所示更改 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('[email protected]') ->subject('About') ->send('My message'); } } ?>
在**src/Template**目录下创建一个**Emails**目录,并在该目录下创建一个名为**index.php**的View文件。将以下代码复制到该文件中。
src/Template/Emails/index.php
Email Sent.
在发送任何电子邮件之前,我们需要对其进行配置。在下图中,您可以看到有两个传输方式,默认方式和Gmail方式。我们使用了Gmail传输方式。
您需要将“GMAIL用户名”替换为您的Gmail用户名,并将“应用密码”替换为您的应用程序密码。您需要在Gmail中启用两步验证并创建一个新的应用密码才能发送电子邮件。
config/app.php
通过访问以下URL来执行上述示例:https://127.0.0.1/cakephp/email
输出
执行后,您将收到以下输出。
CakePHP - 会话管理
会话允许我们跨请求管理唯一用户,并为特定用户存储数据。会话数据可以在任何地方访问,任何您可以访问请求对象的地方,即会话可以从控制器、视图、辅助程序、单元和组件访问。
访问会话对象
可以通过执行以下代码来创建会话对象。
$session = $this->request->session();
写入会话数据
要向会话中写入内容,我们可以使用**write()**会话方法。
Session::write($key, $value)
上述方法将采用两个参数:**值**和**键**,值将存储在该键下。
示例
$session->write('name', 'Virat Gandhi');
读取会话数据
要从会话中检索存储的数据,我们可以使用**read()**会话方法。
Session::read($key)
上述函数只接受一个参数,即写入会话数据时使用的**值的键**。一旦提供了正确的键,函数将返回其值。
示例
$session->read('name');
当您想检查特定数据是否存在于会话中时,可以使用**check()**会话方法。
Session::check($key)
上述函数只接受键作为参数。
示例
if ($session->check('name')) { // name exists and is not null. }
删除会话数据
要从会话中删除数据,我们可以使用**delete()**会话方法来删除数据。
Session::delete($key)
上述函数只接受要从会话中删除的值的键。
示例
$session->delete('name');
当您想读取然后从会话中删除数据时,可以使用**consume()**会话方法。
static Session::consume($key)
上述函数只接受键作为参数。
示例
$session->consume('name');
销毁会话
当用户从站点注销时,我们需要销毁用户会话,并且要销毁会话,可以使用**destroy()**方法。
Session::destroy()
示例
$session->destroy();
销毁会话将从服务器中删除所有会话数据,但不会删除会话cookie。
更新会话
在您想更新用户会话的情况下,我们可以使用**renew()**会话方法。
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 retrieveSessionData() { //create session object $session = $this->request->getSession(); //read data from session $name = $session->read('name'); $this->set('name',$name); } public function writeSessionData(){ //create session object $session = $this->request->getSession(); //write data in session $session->write('name','Virat Gandhi'); } public function checkSessionData(){ //create session object $session = $this->request->getSession(); //check session data $name = $session->check('name'); $address = $session->check('address'); $this->set('name',$name); $this->set('address',$address); } public function deleteSessionData(){ //create session object $session = $this->request->getSession(); //delete session data $session->delete('name'); } public function destroySessionData(){ //create session object $session = $this->request->getSession(); //destroy session $session->destroy(); } } ?>
在**src/Template**目录下创建一个**Sessions**目录,并在该目录下创建一个名为**write_session_data.php**的**View**文件。将以下代码复制到该文件中。
src/Template/Sessions/write_session_data.php
The data has been written in session.
在同一个**Sessions**目录下创建另一个名为**retrieve_session_data.php**的**View**文件,并将以下代码复制到该文件中。
src/Template/Sessions/retrieve_session_data.php
Here is the data from session. Name: <?=$name;?>
在同一个Sessions目录下创建另一个名为**check_session_data.ctp**的View文件,并将以下代码复制到该文件中。
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
Data deleted from session.
在同一个Sessions目录下创建另一个名为**destroy_session_data.ctp**的View文件,并将以下代码复制到该文件中。
src/Template/Sessions/destroy_session_data.ctp
Session Destroyed.
输出
通过访问以下URL来执行上述示例。此URL将帮助您向会话中写入数据。
https://127.0.0.1/cakephp4/session-write
访问以下URL**以读取会话数据:https://127.0.0.1/cakephp4/session-read**
访问以下URL**以检查会话数据:https://127.0.0.1/cakephp4/session-check**
访问以下URL**以删除会话数据:https://127.0.0.1/cakephp4/session-delete** 访问以下URL
访问以下URL**以销毁会话数据:https://127.0.0.1/cakephp4/session-destroy**
CakePHP - Cookie 管理
使用CakePHP处理Cookie很容易且安全。有一个CookieComponent类用于管理Cookie。该类提供了几种处理Cookie的方法。
要使用cookie,请将这两个类添加到您的控制器中:
use Cake\Http\Cookie\Cookie; use Cake\Http\Cookie\CookieCollection;
必须首先创建cookie对象才能注册cookie。
$cookie = new Cookie(name,value,expiration time,path,domain);
名称和值是必须的,其他参数是可选的。
写入Cookie
以下是写入cookie的语法。
$cookie = new Cookie(name,value,expiration time,path,domain);
创建的cookie必须添加到cookieCollection中,如下所示:
$cookie = new Cookie('name','XYZ'); $cookies = new CookieCollection([$cookie]);
如果cookie collection对象已经创建,则可以添加其余cookie,如下所示:
$cookies = $cookies->add($cookie);
读取Cookie
要读取cookie,请使用cookiecollection的get()方法。
语法
读取cookie的语法如下:
Cake\Http\Cookie\CookieCollection::get($name)
这将返回cookiecollection接口,要获取cookie的值,您必须调用getValue()方法。
Cake\Http\Cookie\CookieCollection Interface::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.php**的**View**文件。将以下代码复制到该文件中。
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来执行上述示例:https://127.0.0.1/cakephp4/cookie/testcookies
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的视图文件。将以下代码复制到该文件中。
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执行上述示例:https://127.0.0.1/cakephp4/login
输出
执行后,您将收到以下输出。
CakePHP - 验证
在制作网站时,通常需要在进一步处理数据之前验证某些内容。CakePHP 提供了验证包,可以轻松构建用于验证数据的验证器。
验证方法
CakePHP在Validation类中提供了各种验证方法。下面列出了一些最常用的方法。
语法 | Add(string $field, array|string $name, array|Cake\Validation\ValidationRule $rule [] ) |
---|---|
参数 |
|
返回值 | $this |
描述 | 向字段的规则集中添加新规则。如果第二个参数是数组,则该字段的规则列表将被第二个参数替换,而第三个参数将被忽略。 |
语法 | allowEmpty(string $field, boolean|string|callable $whentrue, string|null $messagenull) |
---|---|
参数 |
|
返回值 | $this |
描述 | 允许字段为空。 |
语法 | alphanumeric (string $field, string|null $messagenull, string|callable|null $whennull) |
参数 |
|
返回值 | $this |
描述 | 向字段添加字母数字规则。 |
语法 | creditCard(string $field , string $type'all', string|null $messagenull, string|callable|null $whennull) |
---|---|
参数 |
|
返回值 | $this |
描述 | 向字段添加信用卡规则。 |
语法 | Email(string $field , boolean $checkMXfalse, string|null $messagenull, string|callable|null, $whennull) |
---|---|
参数 |
|
返回值 | $this |
描述 | 向字段添加电子邮件验证规则。 |
语法 | maxLength(string $field, integer $max, string|null $messagenull, string|callable|null $whennull) |
---|---|
参数 |
|
返回值 | $this |
描述 | 向字段添加字符串长度验证规则。 |
语法 | minLength(string $field, integer $min, string|null $messagenull, string|callable|null $whennull) |
---|---|
参数 |
|
返回值 | $this |
描述 | 向字段添加字符串长度验证规则。 |
语法 | notBlank(string $field, string|null $messagenull, string|callable|null $whennull) |
---|---|
参数 |
|
返回值 | $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.php的视图文件。将以下代码复制到该文件中。
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 来执行上述示例:
https://127.0.0.1/cakephp4/validation
输出
点击提交按钮而不输入任何内容。您将收到以下输出。
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.php的视图文件。将以下代码复制到该文件中。
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 来执行上述示例:
https://127.0.0.1/cakephp4/getData
输出
点击提交按钮而不输入任何内容。您将收到以下输出。
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' => '[email protected]' ]); } } ?>
在src/Template处创建一个名为Requests的目录,并在该目录下创建一个名为index.php的视图文件。将以下代码复制到该文件中。
src/Template/Requests/index.php
<h3>Testing Post Method</h3>
通过访问以下 URL 来执行上述示例:
https://127.0.0.1/cakephp4/postData
输出
以下是代码的输出:
同样,您可以尝试PUT方法。
$http = new Client(); $response = $http->put('https://postman-echo.com/post', [ 'name'=> 'ABC', 'email' => '[email protected]' ]);
CakePHP - 分页
如果我们要显示大量数据,可以使用分页功能,CakePHP 4 提供了这个非常易于使用的功能。
我们有一个名为“articles”的表,包含以下数据:
让我们使用分页功能以页面的形式显示数据,而不是一次性显示所有数据。
示例
按照以下程序所示,更改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的视图文件。将以下代码复制到该文件中。
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 来执行上述示例:
https://127.0.0.1/cakephp4/posts
输出
运行代码后,您将看到以下输出:
点击下面的数字切换到下一页,或使用下一页或上一页按钮。
例如
您将看到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的视图文件。将以下代码复制到该文件中。
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 来执行上述示例:
https://127.0.0.1/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.php的视图文件。将以下代码复制到该文件中。
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执行上述示例:
https://127.0.0.1/cakephp4/fileupload
输出
执行上述代码后,您应该看到以下输出: