目录

CakePHP - 快速指南

CakePHP - Overview

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

  • 开源
  • MVC框架
  • 模板引擎
  • 缓存操作
  • 搜索引擎友好的URL
  • 轻松CRUD(创建,读取,更新,删除)数据库交互。
  • 图书馆和助手
  • 内置验证
  • Localization
  • 电子邮件,Cookie,安全性,会话和请求处理组件
  • 查看AJAX,JavaScript,HTML表单等的助手

CakePHP请求周期

下图说明了请求生命周期的工作原理 -

CakePHP请求周期

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

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

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

  • 配置的任何dispatch filters都可以处理请求,并可选择生成响应。

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

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

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

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

  • 响应将发送回客户端。

CakePHP - Installation

安装CakePHP简单易行。 您可以从composer安装它,也可以从github下载它 - https://github.com/cakephp/cakephp/releases 。 我们将进一步了解如何在WampServer中安装CakePHP。 从github下载后,解压缩WampServer中名为“CakePHP”的文件夹中的所有文件。 您可以为文件夹提供自定义名称,但我们使用了“CakePHP”。

确保目录logs, tmp及其所有子目录具有write permission因为CakePHP将这些目录用于各种操作。

解压缩之后,通过访问浏览器中的以下URL来检查它是否已正确安装 - http://localhost:85/CakePHP/

上面的URL将引导您进入如下所示的屏幕。 这表明CakePHP已成功安装。

CakePHP安装

CakePHP - Folder Structure

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

CakePHP文件夹结构

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

S.No 文件夹名称和描述
1

bin

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

2

config

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

3

logs

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

4

plugins

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

5

src

src文件夹将是您工作的魔力:它是应用程序文件的放置位置。 CakePHP的src文件夹是您进行大部分应用程序开发的地方。 让我们看一下src里面的文件夹。

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

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

  • 区域设置存储用于国际化的字符串文件。

  • 模型包含应用程序的表,实体和行为。

  • 查看演示类放在此处:单元格,帮助程序和模板文件。

  • 模板演示文件放在此处:元素,错误页面,布局和视图模板文件。

6

tests

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

7

tmp

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

8

vendor

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

9

webroot

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

CakePHP - Configuration

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

一般配置

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

S.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

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

13

Security.salt

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

14

Asset.timestamp

在使用正确的帮助程序时,附加时间戳,该时间戳是资产文件URL(CSS,JavaScript,Image)末尾特定文件的上次修改时间。 有效值 -

  • (bool)false - 什么都不做(默认)

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

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

数据库配置

可以在config/app.php文件中config/app.php数据库。 此文件包含带有提供参数的默认连接,可以根据我们的选择进行修改。 下面的屏幕截图显示了应根据要求修改的默认参数和值。

组态

让我们详细了解每个参数 -

S.NO 键和说明
1

className

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

2

driver

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

3

persistent

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

4

host

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

5

username

数据库用户名

6

password

数据库密码

7

database

数据库名称

8

port (optional)

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

9

encoding

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

10

timezone

要设置的服务器时区。

11

schema

在PostgreSQL数据库设置中使用,以指定要使用的架构。

12

unix_socket

由支持它通过Unix套接字文件连接的驱动程序使用。 如果您正在使用PostgreSQL并且想要使用Unix套接字,请将主机密钥留空。

13

ssl_key

SSL密钥文件的文件路径。 (仅支持MySQL)。

14

ssl_cert

SSL证书文件的文件路径。 (仅支持MySQL)。

15

ssl_ca

SSL证书颁发机构的文件路径。 (仅支持MySQL)。

16

init

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

17

log

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

18

quoteIdentifiers

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

19

flags

应该传递给基础PDO实例的PDO常量的关联数组。

20

cacheMetadata

无论是布尔值true,还是包含用于存储元数据的缓存配置的字符串。不建议使用元数据缓存禁用,并且可能导致性能非常差。

CakePHP - Email Configuration

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

电子邮件配置传输

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

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

  • Smtp - 使用SMTP发送

  • Debug - 不发送电子邮件,只返回结果

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

例子 (Example)

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

电子邮件传递配置文件

通过传递配置文件,您可以预定义应用程序中有关电子邮件的各种属性,并为设置指定名称。 这样可以节省整个应用程序的重复,使维护和开发更容易。 每个配置文件都接受许多密钥。 以下是电子邮件传递配置文件的示例。

例子 (Example)

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

CakePHP - Routing

路由将您的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的索引方法。 在两种方法中, scoped route builder提供了更好的性能。

连接路线

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

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

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

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

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

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

这是路线的基本格式 -

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

例子 (Example)

在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('/', ['controller' => 'Tests', 'action' => 'index']);
      $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/TestsController.php

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

创建一个文件夹在src/TemplateTests并在该文件夹下创建一个名为index.ctpView file 。 复制该文件中的以下代码。

src/Template/Tests/index.ctp

This is CakePHP tutorial and this is an example of connecting routes.

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

http://localhost:85/CakePHP/

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

路由

传递参数

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

作为action方法的参数

下面的示例显示了我们如何将参数传递给控制器​​的操作。

访问以下URL - http://localhost:85/CakePHP/tests/value1/value2

这将匹配以下路线。

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

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

作为数字索引数组

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

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

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

使用路由数组

该论点也可以通过以下声明传递给行动 -

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

上面的语句将两个参数5和6传递给TestController's index()方法。

例子 (Example)

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('tests/:arg1/:arg2', ['controller' => 'Tests', 'action'=> 
         'index'],['pass' =>['arg1', 'arg2']]);
      $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/TestsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class TestsController extends AppController{
      public function index($arg1,$arg2){
         $this->set('argument1',$arg1);
         $this->set('argument2',$arg2);
      }
   }
?>

创建文件夹在src/Template Tests并在该文件夹下创建一个名为index.ctpView文件。 复制该文件中的以下代码。

src/Template/Tests/index.ctp

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

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

http://localhost:85/CakePHP/tests/Virat/Kunal

执行时,上面的URL将产生以下输出。

CakePHP路由

CakePHP - Generating URLs

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

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

上述功能将有两个参数 -

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

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

例子 (Example)

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('/generate',['controller'=>'Generates','action'=>'index']);
   });
   Plugin::routes();

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

src/Controller/GeneratesController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   class GeneratesController extends AppController{
      public function index(){
      }
   }
?>

创建文件夹Generates at src/Template并在该文件夹下创建一个名为index.ctpView文件。 复制该文件中的以下代码。

src/Template/Generates/index.ctp

This is CakePHP tutorial and this is an example of Generating URLs.

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

http://localhost:85/CakePHP/generate

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

生成网址

CakePHP - Redirect Routing

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

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

上述功能有三个参数 -

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

  • 要重定向到的URL。

  • 一个数组,它将路径中的命名元素与该元素应匹配的正则表达式相匹配。

例子 (Example)

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('/generate2', ['controller' => 'Tests', 'action' => 'index']);
      $routes->redirect('/generate1','http://iowiki.com/');
      $routes->connect('/generate_url',['controller'=>'Generates','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

  • URL 1 - http:// localhost:85/CakePHP/generate_url

  • URL 2 - http:// localhost:85/CakePHP/generate1

  • URL 3 - http:// localhost:85/CakePHP/generate2

URL 1的输出

生成路由

URL 2的输出

您将被重定向到http://iowiki.com

URL 3的输出

生成路由

CakePHP - Controllers

名称控制器指示控制应用程序。 它就像模型和视图之间的桥梁。 控制器处理请求数据,确保调用正确的模型并呈现正确的响应或视图。 控制器类中的方法称为actions 。 每个控制器遵循命名约定。 Controller类名称采用复数形式,Camel Cased,以Controller - PostsController

AppController (AppController)

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

<?php
   namespace App\Controller;
   use Cake\Controller\Controller;
   use Cake\Event\Event;
   class AppController extends Controller{
      public function initialize(){
         parent::initialize();
         $this->loadComponent('RequestHandler');
         $this->loadComponent('Flash');
      }
      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this->viewVars) &&
            in_array($this->response->type(), ['application/json', application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }

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

控制器动作

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

例子 (Example)

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

重定向(Redirecting)

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

语法 (Syntax)

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

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

$this->setAction('index');

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

例子 (Example)

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('/redirectcontroller',['
         controller'=>'Redirects','action'=>'action1']);
      $routes->connect('/redirectcontroller2',['
         controller'=>'Redirects','action'=>'action2']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/RedirectsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   class RedirectsController extends AppController{
      public function action1(){
      }
      public function action2(){
         echo "redirecting from action2";
         $this->setAction('action1');
      }
   }
?>

创建目录Redirectssrc/Template并在该目录下创建一个名为action1.ctpView文件。 复制该文件中的以下代码。

src/Template/Redirects/action1.ctp

This is an example of how to redirect within controller.

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

http://localhost:85/CakePHP/redirect-controller

输出 (Output)

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

重定向

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

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

重定向动作2

加载模型

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

语法 (Syntax)

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

上述功能有两个参数 -

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

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

例子 (Example)

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

$this->loadModel('Articles');

CakePHP - Views

MVC中的字母“V”用于视图。 视图负责根据请求将输出发送给用户。 View Classes是加速开发过程的有效方法。

查看模板

CakePHP的View Templates文件具有默认扩展名。 ctp (CakePHP模板)。 这些模板从控制器获取数据,然后渲染输出,以便可以正确地显示给用户。 我们可以在模板中使用变量,各种控制结构。

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

简而言之,控制器的名称(ProductsController)与文件夹(Products)的名称相同,但没有控制器和控制器(ProductsController)的控制器和操作/方法(view())的名称相同。查看文件(view.ctp)。

查看变量

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

语法 (Syntax)

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

此方法有两个参数 - the name of the variable its value

例子 (Example)

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('template',['controller'=>'Products','action'=>'view']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/ProductsController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   class ProductsController extends AppController{
      public function view(){
         $this->set('Product_Name','XYZ');
      }
   }
?>

src/Template和该文件夹下创建目录产品创建一个名为view.ctp.View文件view.ctp. 复制该文件中的以下代码。

src/Template/Products/view.ctp

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

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

http://localhost:85/CakePHP/template

输出 (Output)

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

制品

CakePHP - Extending Views

很多时候,在制作网页时,我们希望在其他页面中重复某些页面。 CakePHP具有这样的功能,可以在另一个视图中扩展视图,为此,我们不需要再次重复代码。 extend()方法用于扩展View文件中的View 。 此方法采用一个参数,即带路径的视图文件的名称。 提供View文件的名称时,请勿使用扩展名.ctp。

例子 (Example)

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('extend',['controller'=>'Extends','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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.ctpView文件。 复制该文件中的以下代码。

src/Template/Extends/header.ctp

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

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

src/Template/Extends/index.ctp

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

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

http://localhost:85/CakePHP/extend

输出 (Output)

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

常用标题

CakePHP - View Elements

网页的某些部分在多个网页上重复,但位于不同的位置。 CakePHP可以帮助我们重复使用这些重复的部分。 这些可重复使用的部件称为Elements − help box, extra menu等。元素基本上是一个mini-view 。 我们也可以在元素中传递变量。

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

上述功能有三个参数 -

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

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

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

在3个论点中,第一个是强制性的,其余的是可选的。

例子 (Example)

src/Template/Element目录中创建一个名为helloworld.ctp的元素文件。 复制该文件中的以下代码。

src/Template/Element/helloworld.ctp

<p>Hello World</p>

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

src/Template/Elems/index.ctp

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

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('/elementexample',['controller'=>'Elems','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/ElemsController.php

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

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

http://localhost:85/CakePHP/element-example

输出 (Output)

执行后,上面的URL将为您提供以下输出。

查看元素

CakePHP - View Events

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

S.No 事件功能和描述
1

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

beforeRender方法在控制器的beforeRender方法之后但在控制器呈现viewlayout之前调用。 这将接收作为参数呈现的文件。

2

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

在呈现每个视图文件之前调用此方法。 这包括elements, views, parent viewslayouts

3

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

在呈现每个View文件之后调用此方法。 这包括elements, viewsparent viewslayouts 。 回调可以修改并返回$content以更改呈现内容在浏览器中的显示方式。

4

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

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

5

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

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

6

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

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

CakePHP - Working with Database

在CakePHP中使用数据库非常简单。 我们将在本章中理解CRUD(创建,读取,更新,删除)操作。 在继续之前,我们需要在数据库中创建以下用户表。

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

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

插入记录

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

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

例子 (Example)

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('/users/add', ['controller' => 'Users', 'action' => 'add']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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->data('username');
            $hashPswdObj = new DefaultPasswordHasher;
            $password = $hashPswdObj->hash($this->request->data('password'));
            $users_table = TableRegistry::get('users');
            $users = $users_table->newEntity();
            $users->username = $username;
            $users->password = $password;
            if($users_table->save($users))
            echo "User is added.";
         }
      }
   }
?>

创建目录Users at src/Template和该目录下的Users at src/Template创建一个名为add.ctp的View文件。 复制该文件中的以下代码。

src/Template/Users/add.ctp

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

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

http://localhost:85/CakePHP/users/add

输出 (Output)

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

用户已添加

CakePHP - View a Record

要查看数据库的记录,我们首先需要使用TableRegistry类来获取表。 我们可以使用get()方法从注册表中get()实例。 get()方法将数据库表的名称作为参数。 现在,这个新实例用于使用find()方法从数据库中查找记录。 此方法将返回所请求表中的所有记录。

例子 (Example)

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('/users', ['controller' => 'Users', 'action' => 'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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.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

输出 (Output)

执行后,上面的URL将为您提供以下输出。

查看记录

CakePHP - Update a Record

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

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

例子 (Example)

在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('/users/edit', ['controller' => 'Users', 'action' => 'edit']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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->data('username');
            $password = $this->request->data('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.ctp的视图。 复制该文件中的以下代码。

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>

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

src/Template/Users/edit.ctp

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

通过访问以下URL执行上述示例,然后单击Edit link以编辑记录。

http://localhost:85/CakePHP/users

输出 (Output)

访问上述URL并单击“ Edit link ,您将收到以下输出,您可以在其中编辑记录。

更新记录

CakePHP - Delete a Record

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

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

例子 (Example)

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('/users/delete', ['controller' => 'Users', 'action' => 'delete']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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');
      }
   }
?>

只需在名为delete.ctp Users目录下创建一个空的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

输出 (Output)

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

删除记录

CakePHP - Services

身份验证 (Authentication)

身份验证是识别正确用户的过程。 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']
         ]);
         $this->Auth->config('authenticate', [
            AuthComponent::ALL => ['userModel' => 'users'], 'Form']);
      }
      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this=>viewVars) &&
         in_array($this->response=>type(), ['application/json', 'application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }

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.ctpView文件。 复制该文件中的以下代码。

src/Template/Authexs/login.ctp

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

创建另一个名为logout.ctp View文件。 复制该文件中的以下代码。

src/Template/Authexs/logout.ctp

You are successfully loggedout.

创建另一个名为index.ctp View文件。 复制该文件中的以下代码。

src/Template/Authexs/index.ctp

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

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

http://localhost:85/CakePHP/auth

输出 (Output)

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

服务验证

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

服务认证

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

CakePHP - Errors and Exception Handling

为了系统的平稳运行,需要有效地处理系统故障。 CakePHP带有默认错误捕获,可以在出现错误时打印并记录错误。 此错误处理程序用于捕获Exceptions 。 debug为true时错误处理程序显示错误,debug为false时记录错误。 CakePHP有许多异常类,内置的异常处理将捕获任何未捕获的异常并呈现有用的页面。

错误和异常配置

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

选项 数据类型 描述
errorLevelint 您有兴趣捕获的错误级别。 使用内置的php错误常量和位掩码来选择您感兴趣的错误级别。
tracebool 在日志文件中包含错误的堆栈跟踪。 每次出错后,堆栈跟踪都将包含在日志中。 这有助于查找错误发生的位置/时间。
exceptionRendererstring 负责呈现未捕获异常的类。 如果选择custom类,则应将该类的文件放在src/Error 。 该类需要实现render()方法。
logbool 如果为true,则异常+其堆栈跟踪将记录到Cake\Log\Log
skipLogarray 不应记录的异常类名数组。 这对于删除NotFoundExceptions或其他常见但不感兴趣的日志消息很有用。
extraFatalErrorMemoryint 设置为兆字节数,以便在遇到致命错误时增加内存限制。 这允许呼吸空间来完成记录或错误处理。

例子 (Example)

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

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.ctpView文件。 复制该文件中的以下代码。

src/Template/Exps/index.ctp

This is CakePHP tutorial and this is an example of Passed arguments.
Argument-1: <?=$argument1?>
Argument-2: <?=$argument2?>

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

http://localhost:85/CakePHP/exception/5/0

输出 (Output)

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

例外

CakePHP - Logging

登录CakePHP是一项非常简单的任务。 你只需要使用一个功能。 您可以记录任何后台进程(如cronjob errors, exceptions, user activities, action taken by users 。 在CakePHP中记录数据很简单 - LogTrait提供了log()函数, LogTrait是几乎所有CakePHP类的共同祖先。

记录配置

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

记录配置

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

CakePHP支持各种日志记录级别,如下所示 -

  • Emergency - 系统无法使用

  • Alert - 必须立即采取行动

  • Critical - 关键条件

  • Error - 错误条件

  • Warning - 警告条件

  • Notice - 正常但重要的条件

  • Info - 信息性消息

  • Debug - 调试级消息

写入日志文件

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

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

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

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

要记录的消息内容。

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

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

第二种是使用任何使用LogTrait Calling log()log() shortcut函数LogTrait Calling log()将在内部调用Log::write() -

例子 (Example)

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('logex',['controller'=>'Logexs','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/LogexController.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');
      }
   }
?>

Logexs at src/Template创建目录Logexs at src/Template在该目录下创建一个名为index.ctpView文件。 复制该文件中的以下代码。

src/Template/Logexs/index.ctp

Something is written in log file. Check log file logs\debug.log

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

http://localhost:85/CakePHP/logex

输出 (Output)

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

Logexs

CakePHP - Form Handling

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

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

Syntax _selectOptions(array $elements array(),array $parents array(),boolean $showParents null,array $attributes array())
Parameters
  • 要格式化的元素

  • OPTGROUP的父母

  • 是否向父母展示

  • HTML属性

Returnsarray
Description 返回格式化的OPTION/OPTGROUP元素的数组

以下函数用于to generate HTML select element

Syntax select(string $ fieldName,array $ options array(),array $ attributes array())
Parameters

SELECT的Name属性

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

select元素的HTML属性。

Returns 格式化的SELECT元素
Description 返回格式化的SELECT元素

以下函数用于在HTML页面上to generate button

Syntax Button(字符串$title ,array $options array())
Parameters
  • 按钮的标题。 不自动HTML编码。

  • 选项和HTML属性的数组。

Returns HTML按钮标记。
Description 创建<button>标记。 type属性默认为type="submit ”。 您可以使用$options['type']将其更改为其他值。

以下函数用于在HTML页面上to generate checkbox

Syntax 复选框(字符串$ fieldName,数组$ options array())
Parameters
  • 字段的名称,例如“Modelname.fieldname”

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

Returns HTML文本输入元素。
Description 创建一个复选框输入小部件。

以下函数用于在HTML页面上to create form

Syntax create(mixed $model null,array $options array())
Parameters
  • 正在为其定义表单的模型名称。 应该包含插件模型的插件名称。 例如ContactManager.Contact。 如果传递数组并且$ options参数为空,则该数组将用作选项。 如果为假,则不使用任何模型。

  • 一系列html属性和选项。 可能的选项包括type,action,url,default,onsubmit,inputDefaults,encoding

Returns 格式化的开始FORM标记。
Description 返回HTML FORM元素。

以下函数用于在HTML页面上provide file uploading functionality

Syntax file(string $fieldName ,array $options array())
Parameters
  • 字段名称,格式为“Modelname.fieldname”

  • HTML属性数组。

Returns 生成的文件输入。
Description 创建文件输入小部件。

以下函数用于在HTML页面上创建hidden element

Syntax hidden(string $ fieldName,array $ options array())
Parameters
  • 字段名称,格式为“Modelname.fieldname”

  • HTML属性数组。

ReturnsA generated hidden input
Description 创建隐藏的输入字段

以下函数用于在HTML页面上生成input element

Syntax 输入(字符串$ fieldName,数组$ options array())
Parameters
  • 这应该是“Modelname.fieldname”

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

ReturnsCompleted form widget
Description 生成一个带有标签和包装器div的表单输入元素

以下函数用于在HTML页面上生成radio button

Syntax Radio(字符串$fieldName ,数组$options array(),数组$attributes array())
Parameters
  • 字段的名称,例如“Modelname.fieldname”

  • 单选按钮选项数组。

  • 上面的HTML属性数组和特殊属性。

ReturnsCompleted radio widget set
Description 创建一组无线电小部件。 默认情况下会创建图例和字段集。 使用$ options来控制它。

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

Syntax 提交(字符串$ caption null,array $ options array())
Parameters
  • 出现在按钮上的标签或者如果字符串包含://或扩展名.jpg,.jpe,.jpeg,.gif,.png,如果扩展名存在则使用图像,并且第一个字符是/,图像是相对于webroot ,或者如果第一个字符不是/,则图像与webroot/img相关。

  • 选项数组。 可能的选项是div,before,after,type等。

ReturnsAn HTML submit button
Description 创建一个提交按钮元素。 此方法将生成《input》元素,可用于通过使用$ options提交和重置表单。 可以通过为$ caption提供图像路径来创建图像提交。

以下函数用于在HTML页面上to generate textarea element

Syntax Textarea(字符串$ fieldName,数组$ options array())
Parameters
  • 字段名称,格式为“Modelname.fieldname”

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

Returns 生成的HTML文本输入元素
DescriptionCreates a textarea widget

例子 (Example)

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('register',['controller'=>'Registrations','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/RegistrationController.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.ctp的View文件。 复制该文件中的以下代码。

src/Template/Registrations/index.ctp

<?php
   echo $this->Form->create("Registrations",array('url'=>'/register'));
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->input('password');
   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:85/CakePHP/register

输出 (Output)

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

表格处理

CakePHP - Internationalization

与许多其他框架一样,CakePHP也支持国际化。 我们需要按照这些步骤从单一语言转到多语言。

Step 1 - 创建单独的Locale目录src\Locale

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

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

msgid "msg"
msgstr "CakePHP Internationalization example."

这里, msgid是将在View模板文件中使用的密钥, msgstr是存储转换的值。

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

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

可以通过以下行在config/bootstrap.php文件中设置缺省语言环境。

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

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

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

例子 (Example)

在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('locale',['controller'=>'Localizations','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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->data('locale');
            I18n::locale($locale);
         }
      }
   }
?>

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

src/Locale/en_US/default.po

msgid "msg"
msgstr "CakePHP Internationalization example."

src/Locale/fr_FR/default.po

msgid "msg"
msgstr "Exemple CakePHP internationalisation."

src/Locale/de_DE/default.po

msgid "msg"
msgstr "CakePHP Internationalisierung Beispiel."

创建目录在src/Template和该目录下的Localizations创建一个名为index.ctp的View文件。 复制该文件中的以下代码。

src/Template/Localizations/index.ctp

<?php
   echo $this->Form->create("Localizations",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:85/CakePHP/locale

输出 (Output)

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

本地化

Email

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

use Cake\Mailer\Email;

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

Syntax From(string | array | null $email null,string | null $name null)
Parameters
  • 字符串与电子邮件

  • Name

Returnsarray|$this
Description 它指定从哪个电子邮件地址; 电子邮件将被发送
Syntax To(string | array | null $email null,string | null $name null)
Parameters
  • 字符串与电子邮件

  • Name

Returnsarray|$this
Description 它指定向谁发送电子邮件
Syntax 发送(字符串|数组| null $content null)
Parameters
  • 包含消息或带消息的数组的字符串。

Returnsarray
Description 使用指定的内容,模板和布局发送电子邮件
Syntax Subject(string | null $subject null)
Parameters
  • 主题字符串

Returnsarray|$this
Description 获取/设置主题。
Syntax 附件(字符串|数组| null $attachments null)
Parameters
  • 带有文件名的文件名或带有文件名的数组

Returnsarray|$this
Description 添加电子邮件附件
Syntax 密件抄送(字符串|数组| null $email null,字符串| null $name null)
Parameters
  • 字符串与电子邮件

  • Name

Returnsarray|$this
DescriptionBcc
Syntax cc(string | array | null $email null,string | null $name null)
Parameters
  • 字符串与电子邮件

  • Name

Returnsarray|$this
DescriptionCc

例子 (Example)

在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('/email',['controller'=>'Emails','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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创建一个目录电子邮件,并在该目录下创建一个名为index.ctp.的View文件index.ctp. 复制该文件中的以下代码。

src/Template/Emails/index.ctp

Email Sent.

在发送任何电子邮件之前,我们需要对其进行配置。 在下面的屏幕截图中,您可以看到有两种传输方式,默认和Gmail。 我们使用过Gmail传输。 您需要将“GMAIL USERNAME”替换为您的Gmail用户名,将“APP PASSWORD”替换为您的应用程序密码。 您需要在Gmail中启用两步验证并创建新的APP密码才能发送电子邮件。

config/app.php

Gmail用户名

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

输出 (Output)

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

电子邮件

CakePHP - Session Management

Session允许我们跨请求管理唯一用户并为特定用户存储数据。 会话数据可以在您有权访问请求对象的任何位置访问,即可以从控制器,视图,帮助程序,单元和组件访问会话。

访问会话对象

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

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

编写会话数据

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

Session::write($key, $value)

上面的方法将采用两个参数, value和将存储valuekey

例子 (Example)

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

阅读会话数据

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

Session::read($key)

上述函数将只接受一个参数, the key of the value参数是the key of the value写入会话数据时使用the key of the value 。 一旦提供了正确的密钥,该函数将返回其值。

例子 (Example)

$session->read('name');

如果要检查会话中是否存在特定数据,则可以使用check() session方法。

Session::check($key)

上面的函数只使用key作为参数。

例子 (Example)

if ($session->check('name')) {
   // name exists and is not null.
}

删除会话数据

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

Session::delete($key)

上面的函数只接受从会话中删除的值的键。

例子 (Example)

$session->delete('name');

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

static Session::consume($key)

上面的函数只将key作为参数。

例子 (Example)

$session->consume('name'); 

销毁会话

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

Session::destroy()

例子 (Example)

$session->destroy();

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

续订会话

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

Session::renew()

例子 (Example)

$session->renew();

完成课程

Make changes in the <b class="notranslate">config/routes.php</b> file as shown in the following program.

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('/sessionobject',
         ['controller'=>'Sessions','action'=>'index']);
      $routes->connect('/sessionread',
         ['controller'=>'Sessions','action'=>'retrieve_session_data']);
      $routes->connect('/sessionwrite',
         ['controller'=>'Sessions','action'=>'write_session_data']);
      $routes->connect('/sessioncheck',
         ['controller'=>'Sessions','action'=>'check_session_data']);
      $routes->connect('/sessiondelete',
         ['controller'=>'Sessions','action'=>'delete_session_data']);
      $routes->connect('/sessiondestroy',
         ['controller'=>'Sessions','action'=>'destroy_session_data']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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->session();
         //read data from session
         $name = $session->read('name');
         $this->set('name',$name);
      }
      public function writeSessionData(){
         //create session object
         $session = $this->request->session();
         //write data in session
         $session->write('name','Virat Gandhi');
      }
      public function checkSessionData(){
         //create session object
         $session = $this->request->session();
         //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->session();
         //delete session data
         $session->delete('name');
      }
      public function destroySessionData(){
         //create session object
         $session = $this->request->session();
         //destroy session
         $session->destroy();
      }
   }
?>

src/Template和该目录下创建一个目录Sessions ,创建一个名为write_session_data.ctpView文件。 复制该文件中的以下代码。

src/Template/Sessions/write_session_data.ctp

The data has been written in session.

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

src/Template/Sessions/retrieve_session_data.ctp

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 filbe 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.

输出 (Output)

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

http://localhost:85/CakePHP/session-write

会议

访问以下URL to read session data - http://localhost:85/CakePHP/session-read

CakePHP会话

访问以下URL to check session data - http://localhost:85/CakePHP/sessioncheck

会议

访问以下URL to delete session data - http://localhost:85/CakePHP/sessiondelete

删除会话

访问以下URL to destroy session data - http://localhost:85/CakePHP/sessiondestroy

会话被破坏

CakePHP - Cookie Management

使用CakePHP处理Cookie非常简单而且安全。 有一个CookieComponent类,用于管理Cookie。 该类提供了几种使用Cookie的方法。

写Cookie

write()方法用于编写cookie。 以下是write()方法的语法。

Cake\Controller\Component\CookieComponent::write(mixed $key, mixed $value = null)

write()方法将采用两个参数, the name of cookie variable ($key)the value of cookie variable ($value)

例子 (Example)

$this->Cookie->write('name', 'Virat');

我们可以传递名称,值对的数组来写多个cookie。

阅读Cookie

read()方法用于读取cookie。 以下是read()方法的语法。

Cake\Controller\Component\CookieComponent::read(mixed $key = null)

read()方法将采用一个参数,即cookie变量($ key)的名称。

例子 (Example)

echo $this->Cookie->read('name');

检查Cookie

check()方法用于检查密钥/路径是否存在且具有非空值。 以下是check()方法的语法。

Cake\Controller\Component\CookieComponent::check($key)

例子 (Example)

echo $this->Cookie->check(‘name’);

删除Cookie

delete()方法用于删除cookie。 以下是delete()方法的语法。

Cake\Controller\Component\CookieComponent::delete(mixed $key)

delete()方法将使用一个参数,即要删除的cookie变量($ key)的名称。

例子1 (Example 1)

$this->Cookie->delete('name');

例子2 (Example 2)

在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('cookie/write',['controller'=>'Cookies','action'=>'write_cookie']);
      $routes->connect('cookie/read',['controller'=>'Cookies','action'=>'read_cookie']);
      $routes->connect('cookie/check',['controller'=>'Cookies','action'=>'check_cookie']);
      $routes->connect('cookie/delete',['controller'=>'Cookies','action'=>'delete_cookie']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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

src/Controller/Cookies/CookiesController.php

<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Controller\Component\CookieComponent;
   class CookiesController extends AppController{
      public $components = array('Cookie');
      public function writeCookie(){
         $this->Cookie->write('name', 'Virat');
      }
      public function readCookie(){
         $cookie_val = $this->Cookie->read('name');
         $this->set('cookie_val',$cookie_val);
      }
      public function checkCookie(){
         $isPresent = $this->Cookie->check('name');
         $this->set('isPresent',$isPresent);
      } 
      public function deleteCookie(){
         $this->Cookie->delete('name');
      }
   }
?>

src/Template和该目录下创建一个目录Cookies ,创建一个名为write_cookie.ctpView文件。 复制该文件中的以下代码。

src/Template/Cookie/write_cookie.ctp

The cookie has been written.

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

src/Template/Cookie/read_cookie.ctp

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

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

src/Template/Cookie/check_cookie.ctp

<?php
   if($isPresent):
?>
The cookie is present.
<?php
   else:
?>
The cookie isn't present.
<?php
   endif;
?>

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

src/Template/Cookie/delete_cookie.ctp

The cookie has been deleted.

输出 (Output)

通过访问以下URL执行上述示例 - http://localhost:85/CakePHP/cookie/write

这将帮助您write data in cookie.

饼干

访问以下URL o read cookie data - http://localhost:85/CakePHP/cookie/read

CakePHP Cookies

访问以下URL to check cookie data - http://localhost:85/CakePHP/cookie/check

CakePHP Cookies

访问以下URL to delete cookie data - http://localhost:85/CakePHP/cookie/delete

Cookie已删除

CakePHP - Security

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

加密和解密

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

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

encrypt方法将text和key作为加密数据的参数,返回值将是带有HMAC校验和的加密值。

要散列数据hash()方法。 以下是hash()方法的语法。

语法 (Syntax)

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

CSRF

CSRF代表Cross Site Request Forgery 。 通过启用CSRF组件,您可以获得针对攻击的保护。 CSRF是Web应用程序中的常见漏洞。 它允许攻击者捕获和重放先前的请求,有时使用图像标记或其他域上的资源提交数据请求。 只需将CsrfComponent添加到组件数组即可启用CSRF,如下所示。

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

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

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

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

安全组件

Security Component为您的应用程序应用更严格的安全性。 它提供各种任务的方法,如 -

  • Restricting which HTTP methods your application accepts的HTTP方法 - 在执行副作用之前,应始终验证正在使用的HTTP方法。 您应该检查HTTP方法或使用Cake\Network\Request::allowMethod()以确保使用正确的HTTP方法。

  • Form tampering protection - 默认情况下,SecurityComponent会阻止用户以特定方式篡改表单。 SecurityComponent将阻止以下事情 -

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

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

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

  • Requiring that SSL be used - 要求SSL安全的所有操作。

  • Limiting cross controller communication - 我们可以限制哪个控制器可以向该控制器发送请求。 我们还可以限制哪些操作可以向此控制器的操作发送请求。

例子 (Example)

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('login',['controller'=>'Logins','action'=>'index']);
      $routes->fallbacks('DashedRoute'); 
   });
   Plugin::routes();

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(){
         parent::initialize();
         $this->loadComponent('Security');
      }
      public function index(){
      }
   }
?>

创建目录登录src/Template并在该目录下创建一个名为index.ctpView文件。 复制该文件中的以下代码。

src/Template/Logins/index.ctp

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

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

输出 (Output)

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

洛金斯

CakePHP - Validation

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

验证方法

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

Syntax Add(string $ field,array | string $ name,array | Cake\Validation\ValidationRule $ rule [])
Parameters
  • 将从中添加规则的字段的名称。

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

  • 要添加的规则

Returns$this
Description 向字段的规则集添加新规则。 如果第二个参数是一个数组,那么该字段的规则列表将被第二个参数替换,第三个参数将被忽略。
Syntax allowEmpty(string $field ,boolean | string | callable $when true,string | null $message null)
Parameters
  • 该字段的名称。

  • 指示允许字段为空的时间。 有效值为true (always), 'create', 'update' 。 如果传递了一个callable,那么只有当回调返回true时,该字段才会为空。

  • 显示该字段不是的消息。

Returns$this
Description 允许字段为空。
Syntax 字母数字(字符串$field ,字符串| null $message null,字符串| callable | null $when null)
Parameters
  • 要应用规则的字段。

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

  • “create”或“update”或者在应用验证规则时返回true的callable。

Returns$this
Description 向字段添加字母数字规则。
Syntax creditCard(string $field ,string $type type'all',string | null $message null,string | callable | null $when null)
Parameters
  • 要应用规则的字段。

  • 您想要允许的卡类型。 默认为“全部”。 您还可以提供一系列可接受的卡类型,例如['mastercard','visa','amex']。

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

  • “create”或“update”或者在应用验证规则时返回true的callable。

Returns$this
Description 将信用卡规则添加到字段。
Syntax Email(string $field ,boolean $checkMX false,string | null $message null,string | callable | null $when null)
Parameters
  • 要应用规则的字段。

  • 是否检查MX记录。

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

  • “create”或“update”或者在应用验证规则时返回true的callable。

Returns$this
Description 将电子邮件验证规则添加到字段。
Syntax maxLength(string $field ,integer $max ,string | null $message null,string | callable | null $when null)
Parameters
  • 要应用规则的字段。

  • 允许的最大长度。

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

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

Returns$this
Description 将字符串长度验证规则添加到字段。
Syntax minLength(string $field ,integer $min ,string | null $message null,string | callable | null $when null)
Parameters
  • 要应用规则的字段。

  • 允许的最大长度。

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

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

Returns$this
Description 将字符串长度验证规则添加到字段。
Syntax notBlank(string $field ,string | null $message null,string | callable | null $when null)
Parameters
  • 要应用规则的字段。

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

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

Returns$this
Description 将notBlank规则添加到字段中。

CakePHP - Creating Validators

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

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()方法添加了密码字段的验证,这将确认密码字段不能为空。

例子 (Example)

在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('validation',['controller'=>'Valids','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

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->data());
         $this->set('errors',$errors);
      }
   }
?>

src/Template创建一个目录Valids并在该目录下创建一个名为index.ctpView文件。 复制该文件中的以下代码。

src/Template/Valids/index.ctp

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

通过访问以下URL执行上述示例 - http://localhost:85/CakePHP/validation

输出 (Output)

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

验证
↑回到顶部↑
WIKI教程 @2018