CakePHP - 快速指南
CakePHP - Overview
CakePHP是一个开源的MVC框架。 它使应用程序的开发,部署和维护变得更加容易。 CakePHP具有多个库来减少大多数常见任务的过载。 以下是使用CakePHP的优点。
- 开源
- MVC框架
- 模板引擎
- 缓存操作
- 搜索引擎友好的URL
- 轻松CRUD(创建,读取,更新,删除)数据库交互。
- 图书馆和助手
- 内置验证
- Localization
- 电子邮件,Cookie,安全性,会话和请求处理组件
- 查看AJAX,JavaScript,HTML表单等的助手
CakePHP请求周期
下图说明了请求生命周期的工作原理 -
典型的CakePHP请求周期从用户请求应用程序中的页面或资源开始。 在高级别,每个请求都经过以下步骤 -
Web服务器重写规则将请求定向到webroot/index.php。
您的应用程序的自动加载器和引导程序文件将被执行。
配置的任何dispatch filters都可以处理请求,并可选择生成响应。
调度程序根据路由规则选择适当的控制器和操作。
调用控制器的操作,控制器与所需的模型和组件交互。
控制器将响应创建委托给View以生成模型数据产生的输出。
视图使用Helpers和Cells来生成响应主体和标头。
响应将发送回客户端。
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 - Folder Structure
看一下下面的截图。 它显示了CakePHP的文件夹结构。
下表描述了每个文件夹的作用 -
S.No | 文件夹名称和描述 |
---|---|
1 | bin bin文件夹包含Cake控制台可执行文件。 |
2 | config config文件夹包含CakePHP使用的(少数)配置文件。 数据库连接详细信息,引导,核心配置文件等应存储在此处。 |
3 | logs logs文件夹通常包含您的日志文件,具体取决于您的日志配置。 |
4 | plugins plugins文件夹是存储应用程序使用的插件的位置。 |
5 | src src文件夹将是您工作的魔力:它是应用程序文件的放置位置。 CakePHP的src文件夹是您进行大部分应用程序开发的地方。 让我们看一下src里面的文件夹。
|
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)末尾特定文件的上次修改时间。 有效值 -
|
数据库配置
可以在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/Template下Tests并在该文件夹下创建一个名为index.ctp的View 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.ctp的View文件。 复制该文件中的以下代码。
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 - 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.ctp的View文件。 复制该文件中的以下代码。
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');
}
}
?>
创建目录Redirects到src/Template并在该目录下创建一个名为action1.ctp的View文件。 复制该文件中的以下代码。
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将为您提供以下输出。
加载模型
在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.ctp的View文件。 复制该文件中的以下代码。
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.ctp的View文件。 复制该文件中的以下代码。
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方法之后但在控制器呈现view和layout之前调用。 这将接收作为参数呈现的文件。 |
2 | Helper::beforeRenderFile(Event $event, $viewFile) 在呈现每个视图文件之前调用此方法。 这包括elements, views, parent views和layouts 。 |
3 | Helper::afterRenderFile(Event $event, $viewFile, $content) 在呈现每个View文件之后调用此方法。 这包括elements, views , parent views和layouts 。 回调可以修改并返回$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.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执行上述示例。
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.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执行上述示例,然后单击删除链接以删除记录。
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.ctp的View文件。 复制该文件中的以下代码。
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配置错误和异常。 错误处理接受一些选项,允许您为应用程序定制错误处理 -
选项 | 数据类型 | 描述 |
---|---|---|
errorLevel | int | 您有兴趣捕获的错误级别。 使用内置的php错误常量和位掩码来选择您感兴趣的错误级别。 |
trace | bool | 在日志文件中包含错误的堆栈跟踪。 每次出错后,堆栈跟踪都将包含在日志中。 这有助于查找错误发生的位置/时间。 |
exceptionRenderer | string | 负责呈现未捕获异常的类。 如果选择custom类,则应将该类的文件放在src/Error 。 该类需要实现render()方法。 |
log | bool | 如果为true,则异常+其堆栈跟踪将记录到Cake\Log\Log 。 |
skipLog | array | 不应记录的异常类名数组。 这对于删除NotFoundExceptions或其他常见但不感兴趣的日志消息很有用。 |
extraFatalErrorMemory | int | 设置为兆字节数,以便在遇到致命错误时增加内存限制。 这允许呼吸空间来完成记录或错误处理。 |
例子 (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.ctp的View文件。 复制该文件中的以下代码。
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 。 文件中有一个日志部分,您可以在其中配置日志记录选项,如以下屏幕截图所示。
默认情况下,您将看到两个日志级别 - 已为您配置了error和debug 。 每个都将处理不同级别的消息。
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.ctp的View文件。 复制该文件中的以下代码。
src/Template/Logexs/index.ctp
Something is written in log file. Check log file logs\debug.log
通过访问以下URL执行上述示例。
http://localhost:85/CakePHP/logex
输出 (Output)
执行后,您将收到以下输出。
CakePHP - Form Handling
CakePHP提供了各种内置标签,可以轻松安全地处理HTML表单。 与许多其他PHP框架一样,HTML的主要元素也是使用CakePHP生成的。 以下是用于生成HTML元素的各种函数。
以下函数用于生成选择选项。
Syntax | _selectOptions(array $elements array(),array $parents array(),boolean $showParents null,array $attributes array()) |
Parameters |
|
Returns | array |
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 |
|
Returns | HTML按钮标记。 |
Description | 创建<button>标记。 type属性默认为type="submit ”。 您可以使用$options['type']将其更改为其他值。 |
以下函数用于在HTML页面上to generate checkbox 。
Syntax | 复选框(字符串$ fieldName,数组$ options array()) |
Parameters |
|
Returns | HTML文本输入元素。 |
Description | 创建一个复选框输入小部件。 |
以下函数用于在HTML页面上to create form 。
Syntax | create(mixed $model null,array $options array()) |
Parameters |
|
Returns | 格式化的开始FORM标记。 |
Description | 返回HTML FORM元素。 |
以下函数用于在HTML页面上provide file uploading functionality 。
Syntax | file(string $fieldName ,array $options array()) |
Parameters |
|
Returns | 生成的文件输入。 |
Description | 创建文件输入小部件。 |
以下函数用于在HTML页面上创建hidden element 。
Syntax | hidden(string $ fieldName,array $ options array()) |
Parameters |
|
Returns | A generated hidden input |
Description | 创建隐藏的输入字段 |
以下函数用于在HTML页面上生成input element 。
Syntax | 输入(字符串$ fieldName,数组$ options array()) |
Parameters |
|
Returns | Completed form widget |
Description | 生成一个带有标签和包装器div的表单输入元素 |
以下函数用于在HTML页面上生成radio button 。
Syntax | Radio(字符串$fieldName ,数组$options array(),数组$attributes array()) |
Parameters |
|
Returns | Completed radio widget set |
Description | 创建一组无线电小部件。 默认情况下会创建图例和字段集。 使用$ options来控制它。 |
以下函数用于在HTML页面上生成submit按钮。
Syntax | 提交(字符串$ caption null,array $ options array()) |
Parameters |
|
Returns | An HTML submit button |
Description | 创建一个提交按钮元素。 此方法将生成《input》元素,可用于通过使用$ options提交和重置表单。 可以通过为$ caption提供图像路径来创建图像提交。 |
以下函数用于在HTML页面上to generate textarea element 。
Syntax | Textarea(字符串$ fieldName,数组$ options array()) |
Parameters |
|
Returns | 生成的HTML文本输入元素 |
Description | Creates 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文件。 此文件包含msgid和msgstr形式的条目,如以下程序所示。
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)
执行后,您将收到以下输出。
CakePHP提供电子邮件类来管理电子邮件相关的功能。 要在任何控制器中使用电子邮件功能,我们首先需要通过编写以下行来加载Email类。
use Cake\Mailer\Email;
Email类提供了各种有用的方法,如下所述。
Syntax | From(string | array | null $email null,string | null $name null) |
Parameters |
|
Returns | array|$this |
Description | 它指定从哪个电子邮件地址; 电子邮件将被发送 |
Syntax | To(string | array | null $email null,string | null $name null) |
Parameters |
|
Returns | array|$this |
Description | 它指定向谁发送电子邮件 |
Syntax | 发送(字符串|数组| null $content null) |
Parameters |
|
Returns | array |
Description | 使用指定的内容,模板和布局发送电子邮件 |
Syntax | Subject(string | null $subject null) |
Parameters |
|
Returns | array|$this |
Description | 获取/设置主题。 |
Syntax | 附件(字符串|数组| null $attachments null) |
Parameters |
|
Returns | array|$this |
Description | 添加电子邮件附件 |
Syntax | 密件抄送(字符串|数组| null $email null,字符串| null $name null) |
Parameters |
|
Returns | array|$this |
Description | Bcc |
Syntax | cc(string | array | null $email null,string | null $name null) |
Parameters |
|
Returns | array|$this |
Description | Cc |
例子 (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
通过访问以下URL执行上述示例: http://localhost:85/CakePHP/email
输出 (Output)
执行后,您将收到以下输出。
CakePHP - Session Management
Session允许我们跨请求管理唯一用户并为特定用户存储数据。 会话数据可以在您有权访问请求对象的任何位置访问,即可以从控制器,视图,帮助程序,单元和组件访问会话。
访问会话对象
可以通过执行以下代码来创建会话对象。
$session = $this->request->session();
编写会话数据
要在会话中编写内容,我们可以使用write() session方法。
Session::write($key, $value)
上面的方法将采用两个参数, value和将存储value的key 。
例子 (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.ctp的View文件。 复制该文件中的以下代码。
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
访问以下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.ctp的View文件。 复制该文件中的以下代码。
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
访问以下URL to check cookie data - http://localhost:85/CakePHP/cookie/check
访问以下URL to delete cookie data - http://localhost:85/CakePHP/cookie/delete
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.ctp的View文件。 复制该文件中的以下代码。
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 |
|
Returns | $this |
Description | 允许字段为空。 |
Syntax | 字母数字(字符串$field ,字符串| null $message null,字符串| callable | null $when null) |
Parameters |
|
Returns | $this |
Description | 向字段添加字母数字规则。 |
Syntax | creditCard(string $field ,string $type type'all',string | null $message null,string | callable | null $when null) |
Parameters |
|
Returns | $this |
Description | 将信用卡规则添加到字段。 |
Syntax | Email(string $field ,boolean $checkMX false,string | null $message null,string | callable | null $when null) |
Parameters |
|
Returns | $this |
Description | 将电子邮件验证规则添加到字段。 |
Syntax | maxLength(string $field ,integer $max ,string | null $message null,string | callable | null $when null) |
Parameters |
|
Returns | $this |
Description | 将字符串长度验证规则添加到字段。 |
Syntax | minLength(string $field ,integer $min ,string | null $message null,string | callable | null $when null) |
Parameters |
|
Returns | $this |
Description | 将字符串长度验证规则添加到字段。 |
Syntax | notBlank(string $field ,string | null $message null,string | callable | null $when null) |
Parameters |
|
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.ctp的View文件。 复制该文件中的以下代码。
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)
单击提交按钮而不输入任何内容。 您将收到以下输出。