CakePHP 快速指南



CakePHP - 概述

CakePHP是一個開源的MVC框架。它使開發、部署和維護應用程式更容易。CakePHP擁有一些庫來減少大多數常見任務的負擔。

CakePHP 的優點

使用 CakePHP 的優點如下:

  • 開源

  • MVC 框架

  • 模板引擎

  • 快取操作

  • 搜尋引擎友好的 URL

  • 簡單的 CRUD(建立、讀取、更新、刪除)資料庫互動。

  • 庫和助手

  • 內建驗證

  • 本地化

  • 電子郵件、Cookie、安全、會話和請求處理元件

  • 用於 AJAX、JavaScript、HTML 表單等的檢視助手

CakePHP 請求週期

下圖描述了 CakePHP 中請求生命週期的工作方式:

CakePHP Works

典型的 CakePHP 請求週期從使用者請求應用程式中的頁面或資源開始。在高層次上,每個請求都經過以下步驟:

  • Web 伺服器重寫規則將請求定向到 webroot/index.php。

  • 執行應用程式的自動載入器和引導檔案。

  • 任何已配置的排程過濾器都可以處理請求,並可以選擇生成響應。

  • 排程程式根據路由規則選擇合適的控制器和操作。

  • 呼叫控制器的操作,控制器與所需的模型和元件互動。

  • 控制器將響應建立委託給檢視以生成模型資料產生的輸出。

  • 檢視使用助手單元生成響應正文和標頭。

  • 響應被髮送回客戶端。

CakePHP - 安裝

本章將演示 CakePHP 4.0.3 的安裝。我們需要安裝的最低 PHP 版本是PHP 7.3

在開始安裝 CakePHP 之前,您需要安裝 PHP 7.3 和 Composer。

對於Windows使用者,請安裝或更新 PHP 版本 > 7.3 的 WAMP 伺服器。

訪問www.wampserver.com/en/download-wampserver-64bits/並安裝它。

對於 Linux 使用者,請參考 Tutorials Point 網站 www.tutorialspoint.com/php7/php7_installation_linux.htm,瞭解 PHP 的安裝方法。

安裝 Composer

訪問 Composer 網站 https://getcomposer.org/download/,根據您的計算機作業系統 (OS) 點選下載,並在您的系統上安裝 Composer。對於 Windows 使用者,請將位置新增到 PATH 變數,以便您可以從任何目錄使用 Composer。

安裝 Composer 後,我們現在開始安裝 CakePHP。

安裝 CakePHP

對於 Windows 使用者,轉到 WAMP 所在的資料夾,在 www/ 資料夾中,建立一個資料夾cakephp4/

對於 Linux 使用者,建立資料夾var/www/html/,然後建立資料夾cakephp4/

  • cakephp4/ 是我們將安裝 CakePHP 的資料夾。

使用 Composer 執行以下命令:

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

命令執行時,您應該看到以下內容:

Command Executes

安裝完成後,使用 localhost 在瀏覽器中開啟您的專案。

路徑為 https:///cakephp。

Cakephp Page

CakePHP - 資料夾結構

在這裡,我們將學習 CakePHP 中的資料夾結構和命名約定。讓我們首先了解資料夾結構。

資料夾結構

請檢視以下螢幕截圖。它顯示了 CakePHP 的資料夾結構。

Structure of CakePHP

下表描述了 CakePHP 中每個資料夾的作用:

序號 資料夾名稱和描述
1

bin

bin 資料夾包含 Cake 控制檯可執行檔案。

2

config

config 資料夾包含 CakePHP 使用的(少量)配置檔案。資料庫連線詳細資訊、載入程式、核心配置檔案等都應儲存在此處。

3

logs

logs 資料夾通常包含您的日誌檔案,具體取決於您的日誌配置。

4

plugins

plugins 資料夾用於儲存應用程式使用的外掛。

5

resources

各個語言環境資料夾中的國際化檔案將儲存在此處。例如 locales/en_US。

6

src

src 資料夾是您施展魔法的地方。這是您的應用程式檔案將被放置的地方,您將在這裡進行大部分應用程式開發。讓我們更仔細地看看 src 內部的資料夾。

  • Console - 包含應用程式的控制檯命令和控制檯任務。

  • Controller - 包含應用程式的控制器及其元件。

  • Model - 包含應用程式的表、實體和行為。

  • View 此處放置演示類:單元、助手和模板檔案。

7

templates

Template 此處放置演示檔案:元素、錯誤頁面、佈局和檢視模板檔案。

8

tests

tests 資料夾是您放置應用程式測試用例的地方。

9

tmp

tmp 資料夾是 CakePHP 儲存臨時資料的地方。它實際儲存的資料取決於您如何配置 CakePHP,但此資料夾通常用於儲存模型描述以及有時儲存會話資訊。

10

vendor

vendor 資料夾是安裝 CakePHP 和其他應用程式依賴項的地方。請承諾不要編輯此資料夾中的檔案。如果您修改了核心,我們將無法幫助您。

11

webroot

webroot 目錄是應用程式的公共文件根目錄。它包含所有您希望公開訪問的檔案。

命名約定

命名約定並非強制遵守,但它是一種良好的編碼實踐,並且隨著專案規模的擴大將非常有用。

控制器約定

控制器類名必須是複數、帕斯卡命名法,並且名稱必須以 Controller 結尾。例如,對於 Students 類,控制器的名稱可以是StudentsController。控制器上的公共方法通常作為可透過 Web 瀏覽器訪問的“操作”公開。

例如,/users/view 預設情況下對映到 UsersController 的view()方法。受保護或私有方法無法透過路由訪問。

檔案和類名約定

大多數情況下,我們看到我們的類名和檔名幾乎相同。CakePHP 中也是如此。

例如,StudentsController 類將具有名為 StudentsController.php 的檔案。檔案必須儲存為模組名稱,並儲存在 app 資料夾中的相應資料夾中。

資料庫約定

用於 CakePHP 模型的表,大多數情況下名稱為複數且帶下劃線。

例如,student_details、student_marks。如果欄位名由兩個單片語成,則使用下劃線,例如 first_name、last_name。

模型約定

對於模型,類名根據資料庫表命名,名稱為複數、帕斯卡命名法,並以 Table 結尾。

例如,StudentDetailsTable、StudentMarksTable

檢視約定

對於檢視模板,檔案基於控制器函式。

例如,如果 StudentDetailsController 類具有 showAll() 函式,則檢視模板將命名為 show_all.php 並儲存在 template/yrmodule/show_all.php 中。

CakePHP - 專案配置

本章將瞭解 CakePHP 中的環境變數、常規配置、資料庫配置電子郵件配置

配置CakePHP 預設情況下帶有一個配置檔案,我們可以根據需要修改它。為此專門有一個資料夾“config”。CakePHP 提供了不同的配置選項。

讓我們首先了解 CakePHP 中的環境變數。

環境變數

環境變數使您的應用程式在不同的環境中更容易工作。例如,在開發伺服器、測試伺服器、暫存伺服器和生產伺服器環境中。對於所有這些環境,您可以使用env() 函式讀取您需要的環境配置並構建您的應用程式。

在您的 config 資料夾中,您會看到 config/.env.example。此檔案包含所有將根據您的環境更改的變數。首先,您可以在 config 資料夾中建立一個檔案,即 config/.env,並定義這些變數並使用它們。如果您需要任何其他變數,它可以放在該檔案中。

您可以使用 env() 函式讀取您的環境變數,如下所示:

示例

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

第一個是您想要的環境變數的名稱,第二個值是預設值。如果找不到環境變數的值,則使用預設值。

常規配置

下表描述了各種變數的作用以及它們如何影響您的 CakePHP 應用程式。

序號 變數名稱和描述
1

debug

更改 CakePHP 除錯輸出。

false = 生產模式。不顯示錯誤訊息、錯誤或警告。

true = 顯示錯誤和警告。

2

App.namespace

在其中查詢應用程式類名稱空間。

3

App.baseUrl

如果您不打算將 Apache 的 mod_rewrite 與 CakePHP 一起使用,請取消此定義的註釋。也不要忘記刪除您的 .htaccess 檔案。

4

App.base

應用程式所在的基目錄。如果為 false,則將自動檢測。

5

App.encoding

定義您的應用程式使用的編碼。此編碼用於在佈局中生成字元集,並編碼實體。它應與為資料庫指定的編碼值匹配。

6

App.webroot

webroot 目錄。

7

App.wwwRoot

webroot 的檔案路徑。

8

App.fullBaseUrl

應用程式根目錄的完全限定域名(包括協議)。

9

App.imageBaseUrl

webroot 下公共影像目錄的 Web 路徑。

10

App.cssBaseUrl

webroot 下公共 css 目錄的 Web 路徑。

11

App.jsBaseUrl

webroot 下公共 js 目錄的 Web 路徑。

12

App.paths

配置非基於類的資源的路徑。支援外掛、模板、語言環境、子鍵,分別允許定義外掛、檢視模板和語言環境檔案的路徑。

13

Security.salt

用於雜湊的隨機字串。此值還在進行對稱加密時用作 HMAC 鹽。

14

Asset.timestamp

在使用適當的助手時,將時間戳(特定檔案的最後修改時間)附加到資產檔案 URL(CSS、JavaScript、影像)的末尾。有效值為:

  • (布林值) false - 不執行任何操作(預設值)。

  • (布林值) true - 當 debug 為 true 時,附加時間戳。

  • (字串) ‘force’ - 始終附加時間戳。

資料庫配置

資料庫可以在 **config/app.php 和 config/app_local.php** 檔案中配置。此檔案包含一個具有預設引數的預設連線,可以根據需要修改。

以下程式碼片段顯示了預設引數和值,應根據需求進行修改。

Config/app_local.php

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

讓我們詳細瞭解 **config/app_local.php** 中的每個引數。

主機

資料庫伺服器的主機名(或 IP 地址)。

使用者名稱

資料庫使用者名稱

密碼

資料庫密碼。

資料庫

資料庫名稱。

用於連線伺服器的 TCP 埠或 Unix 套接字。

config/app.php

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

讓我們詳細瞭解 **config/app.php** 中的每個引數。

日誌
序號 鍵值 & 描述
1

類名

表示與資料庫伺服器連線的類的完全名稱空間類名。此類負責載入資料庫驅動程式,提供 SQL 事務機制和準備 SQL 語句等。

2

驅動程式

用於實現資料庫引擎所有特性的驅動程式類名。這可以是使用外掛語法的簡短類名、完全名稱空間名稱或構造的驅動程式例項。簡短類名的示例包括 Mysql、Sqlite、Postgres 和 Sqlserver。

3

持久連線

是否使用與資料庫的持久連線。

4

編碼

指示在向伺服器傳送 SQL 語句時使用的字元集,例如“utf8”等。

5

時區

要設定的伺服器時區。

6

初始化

建立連線時應傳送到資料庫伺服器的查詢列表。

7

日誌

設定為 true 以啟用查詢日誌記錄。啟用後,查詢將在除錯級別使用 queriesLog 範圍記錄。

8

引用識別符號

如果在表名或列名中使用保留字或特殊字元,則設定為 true。啟用此設定將導致使用查詢生成器構建的查詢在建立 SQL 時引用識別符號。它會降低效能。

9

標誌

應傳遞給底層 PDO 例項的 PDO 常量的關聯陣列。

10

快取元資料

布林值 true 或包含用於儲存元資料的快取配置的字串。不建議停用元資料快取,這可能會導致效能非常差。

電子郵件配置

可以在 **config/app.php** 檔案中配置電子郵件。無需在 config/app.php 中定義電子郵件配置。無需配置即可使用電子郵件。只需使用相應的方法分別設定所有配置或載入配置陣列即可。電子郵件預設配置使用 **config()** 和 **configTransport()** 建立。

電子郵件配置傳輸

透過將傳輸與投遞配置檔案分開定義,可以輕鬆地在多個配置檔案中重用傳輸配置。可以為生產、開發和測試指定多個配置。每個傳輸都需要一個 className。有效選項如下:

  • **Mail** - 使用 PHP mail 函式傳送

  • **Smtp** - 使用 SMTP 傳送

  • **Debug** - 不傳送電子郵件,只返回結果

可以透過將相應的檔案新增到 **src/Mailer/Transport** 來新增自定義傳輸(或覆蓋現有傳輸)。傳輸應命名為 **YourTransport.php**,其中“**Your**”是傳輸的名稱。

以下是電子郵件配置傳輸的示例。

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

電子郵件投遞配置檔案

投遞配置檔案允許預定義有關應用程式中電子郵件訊息的各種屬性,併為設定命名。這節省了應用程式中的重複工作,並簡化了維護和開發。每個配置檔案都接受多個鍵。

以下是一個電子郵件投遞配置檔案的示例。

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

CakePHP - 路由

在本章中,我們將學習以下與路由相關的主題:

  • 路由介紹
  • 連線路由
  • 向路由傳遞引數
  • 生成 URL
  • 重定向 URL

路由介紹

在本節中,我們將瞭解如何實現路由,如何將引數從 URL 傳遞到控制器的操作,如何生成 URL,以及如何重定向到特定 URL。通常,路由在 **config/routes.php** 檔案中實現。路由可以透過兩種方式實現:

  • 靜態方法
  • 作用域路由構建器

這是一個展示兩種型別的示例。

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

這兩種方法都將執行 **ArticlesController** 的 index 方法。在這兩種方法中,**作用域路由構建器** 的效能更好。

連線路由

**Router::connect()** 方法用於連線路由。以下是該方法的語法:

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

**Router::connect()** 方法有三個引數:

  • 第一個引數是您希望匹配的 URL 模板。

  • 第二個引數包含路由元素的預設值。

  • 第三個引數包含路由選項,通常包含正則表示式規則。

這是一個路由的基本格式:

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

示例

按照以下所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/TestsController.php** 建立一個 **TestsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/TestsController.php

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

在 **src/Template** 下建立一個名為 **Tests** 的資料夾,並在該資料夾下建立一個名為 show.php 的 **檢視檔案**。將以下程式碼複製到該檔案中。

src/Template/Tests/show.php

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

透過訪問以下 URL(位於 https:///cakephp4/)來執行上述示例。

輸出

上述 URL 將產生以下輸出。

Above URL

傳遞的引數

傳遞的引數是在 URL 中傳遞的引數。這些引數可以傳遞到控制器的操作。這些傳遞的引數可以透過三種方式傳遞給您的控制器。

作為操作方法的引數

以下示例顯示瞭如何將引數傳遞到控制器的操作。訪問以下 URL:https:///cakephp4/tests/value1/value2

這將匹配以下路由行。

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

這裡,URL 中的 value1 將分配給 arg1,value2 將分配給 arg2。

作為數字索引陣列

將引數傳遞到控制器的操作後,可以使用以下語句獲取引數。

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

傳遞給控制器操作的引數將儲存在 $args 變數中。

使用路由陣列

引數也可以透過以下語句傳遞給操作:

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

上述語句將向 TestController 的 show() 方法傳遞兩個引數 5 和 6。

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/TestsController.php** 建立一個 **TestsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/TestsController.php

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

在 **src/Template** 下建立一個名為 **Tests** 的資料夾,並在該資料夾下建立一個名為 show.php 的 **檢視** 檔案。將以下程式碼複製到該檔案中。

src/Template/Tests/show.php。

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

透過訪問以下 URL https:///cakephp4/tests/Virat/Kunal 來執行上述示例。

輸出

執行後,上述 URL 將產生以下輸出。

Passed Argument

生成 URL

這是 CakePHP 的一個很酷的功能。使用生成的 URL,可以輕鬆更改應用程式中 URL 的結構,而無需修改整個程式碼。

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

上述函式將接受兩個引數:

  • 第一個引數是一個數組,指定以下任何一個:**'controller'、'action'、'plugin'**。此外,還可以提供路由元素或查詢字串引數。如果是字串,可以指定任何有效的 url 字串的名稱。

  • 如果為 true,則完整的基 URL 將附加到結果前面。預設為 false。

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/GeneratesController.php** 建立一個 **GeneratesController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/GeneratesController.php

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

在 **src/Template** 下建立一個名為 **Generates** 的資料夾,並在該資料夾下建立一個名為 show.php 的 **檢視** 檔案。將以下程式碼複製到該檔案中。

src/Template/Generates/show.php

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/generate

輸出

上述 URL 將產生以下輸出:

Generating URL

重定向路由

當我們想要通知客戶端應用程式此 URL 已移動時,重定向路由非常有用。可以使用以下函式重定向 URL:

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

上述函式有三個引數,如下所示:

  • 描述路由模板的字串。

  • 要重定向到的 URL。

  • 一個數組,將路由中的命名元素與該元素應匹配的正則表示式匹配。

示例

按照以下所示修改 **config/routes.php** 檔案。這裡,我們使用了之前建立的控制器。

config/routes.php

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

透過訪問以下 URL 來執行上述示例。

**URL 1** - https:///cakephp4/generate

URL 1 的輸出

Execute URL

**URL 2** - https:///cakephp4/redirect

URL 2 的輸出

您將被重定向到 https://tutorialspoint.tw

CakePHP - 控制器

控制器顧名思義控制應用程式。它充當模型和檢視之間的橋樑。控制器處理請求資料,確保呼叫正確的模型並呈現正確的響應或檢視。

控制器類中的方法稱為**操作**。每個控制器都遵循命名約定。控制器類名採用複數形式、駝峰式大小寫,並以 Controller 結尾——**PostsController**。

AppController

**AppConttroller** 類是所有應用程式控制器的父類。此類擴充套件了 CakePHP 的 **Controller** 類。AppController 在 **src/Controller/AppController.php** 中定義。該檔案包含以下程式碼。

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

**AppController** 可用於載入將在應用程式的每個控制器中使用的元件。在 AppController 中建立的屬性和方法將可用於擴充套件它的所有控制器。**initialize()** 方法將在控制器建構函式的末尾呼叫以載入元件。

控制器操作

控制器類中的方法稱為操作。這些操作負責為發出請求的瀏覽器/使用者傳送適當的響應。檢視透過操作的名稱呈現,即控制器中方法的名稱。

示例

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

如上例所示,**RecipesController** 有 3 個操作:**View**、Share 和 **Search**。

重定向

要將使用者重定向到同一控制器的另一個操作,可以使用 setAction() 方法。以下是 setAction() 方法的語法。

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

以下程式碼將把使用者重定向到同一控制器的 index 操作。

$this->setAction('index');

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

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 src/Controller/RedirectsController.php 建立一個 **RedirectsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/RedirectsController.php

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

在 **src/Template** 下建立一個名為 **Redirects** 的目錄,並在該目錄下建立一個名為 action1.php 的 **檢視** 檔案。將以下程式碼複製到該檔案中。

src/Template/Redirects/action1.php

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

透過訪問以下 URL 來執行上述示例。

https:///cakephp4/redirect-controller

輸出

執行後,您將收到以下輸出。

Controller

現在,訪問以下 URL:https:///cakephp4/redirect-controller2

上述 URL 將提供以下輸出。

Redirect

載入模型

在 CakePHP 中,可以使用 **loadModel()** 方法載入模型。以下是 **loadModel()** 方法的語法:

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

該函式有兩個引數,如下所示:

  • 第一個引數是模型類的名稱。

  • 第二個引數是要載入的儲存庫型別。

示例

如果要在控制器中載入 Articles 模型,可以在控制器的 action 中寫入以下程式碼:

$this->loadModel('Articles');

CakePHP - 檢視

MVC 中的字母“V”代表檢視(Views)。檢視負責根據請求向用戶傳送輸出。**檢視類**是加速開發過程的一種有效方法。

檢視模板

CakePHP 的檢視模板檔案從控制器獲取資料,然後呈現輸出,以便將其正確顯示給使用者。我們可以在模板中使用變數和各種控制結構。

模板檔案儲存在 **src/Template/** 目錄下,位於使用這些檔案的控制器的同名目錄中,並以其對應的 action 命名。例如,Products 控制器“view()” action 的**檢視**檔案通常位於 src/Template/Products/view.php。

簡而言之,控制器的名稱 (ProductsController) 與資料夾的名稱 (Products) 相同,只是去掉了 Controller 字樣;控制器的 action/方法名稱 (view()) 與檢視檔名稱 (view.php) 相同。

檢視變數

檢視變數是從控制器獲取值的變數。我們可以在檢視模板中使用任意數量的變數。我們可以使用 **set()** 方法將值傳遞給檢視中的變數。這些設定的變數在檢視和 action 呈現的佈局中都可用。以下是 **set()** 方法的語法:

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

此方法有兩個引數:**變數的名稱**和**其值**。

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/ProductsController.php** 建立一個 **ProductsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/ProductsController.php

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

在 **src/Template** 目錄下建立一個名為 Products 的目錄,並在該目錄下建立一個名為 view.php 的**檢視**檔案。將以下程式碼複製到該檔案中。

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

透過訪問以下 URL 來執行上述示例。

https:///cakephp4/template

輸出

上述 URL 將產生以下輸出。

Variables

CakePHP - 擴充套件檢視

在製作網頁時,我們常常需要在其他頁面中重複某些頁面部分。CakePHP 提供了這樣的功能,允許在一個檢視中擴充套件另一個檢視,而無需重複程式碼。

**extend()** 方法用於在**檢視**檔案中擴充套件檢視。此方法接受一個引數,即帶有路徑的檢視檔案的名稱。在提供檢視檔案的名稱時,不要使用副檔名 .ctp。

示例

按以下程式所示更改 config/routes.php 檔案。

config/routes.php

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

在 **src/Controller/ExtendsController.php** 建立一個 **ExtendsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/ExtendsController.php

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

在 **src/Template** 目錄下建立一個名為 **Extends** 的目錄,並在該目錄下建立一個名為 header.php 的**檢視**檔案。將以下程式碼複製到該檔案中。

src/Template/Extends/header.php

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

在 **Extends** 目錄下建立另一個名為 **index.php** 的**檢視**檔案。將以下程式碼複製到該檔案中。在這裡,我們正在擴充套件上面的檢視 **header.php**。

src/Template/Extends/index.php

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

訪問以下 URL https:///cakephp4/extend 執行上述示例。

輸出

執行後,您將收到以下輸出。

Common Header

CakePHP - 檢視元素

網頁的某些部分在多個網頁上重複出現,但在不同的位置。CakePHP 可以幫助我們重用這些重複的部分。這些可重用的部分稱為**元素 - 幫助框、額外選單**等。元素基本上是一個**迷你檢視**。我們也可以在元素中傳遞變數。

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

上述函式有三個引數,如下所示:

  • 第一個引數是 **src/Template/element/** 資料夾中模板檔案的名稱。

  • 第二個引數是要提供給呈現檢視的資料陣列。

  • 第三個引數用於選項陣列,例如快取。

在三個引數中,第一個是必需的,其餘是可選的。

示例

在 **src/Template/element** 目錄下建立一個名為 **helloworld.php** 的元素檔案。將以下程式碼複製到該檔案中。

src/Template/element/helloworld.php

<p>Hello World</p>

在 **src/Template** 目錄下建立一個名為 **Elems** 的資料夾,並在該目錄下建立一個名為 index.php 的**檢視**檔案。將以下程式碼複製到該檔案中。

src/Template/Elems/index.php

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

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/ElemsController.php** 建立一個 **ElemsController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/Controller/ElemsController.php

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

訪問以下 URL https:///cakephp4/element-example 執行上述示例。

輸出

執行後,上述 URL 將給出以下輸出。

Element Example

CakePHP - 檢視事件

我們可以使用檢視事件使用多個回撥/事件。這些事件有助於在某些事情發生之前或之後執行多項任務。以下是可用於 CakePHP 的回撥列表:

序號 事件函式和說明
1

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

**beforeRender** 方法在控制器的 beforeRender 方法之後但控制器呈現**檢視**和**佈局**之前呼叫。這將接收正在呈現的檔案作為引數。

2

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

此方法在呈現每個檢視檔案之前呼叫。這包括**元素、檢視、父檢視**和**佈局**。

3

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

此方法在呈現每個檢視檔案之後呼叫。這包括**元素、檢視、父檢視**和**佈局**。回撥可以修改並返回**$content** 以更改呈現的內容如何在瀏覽器中顯示。

4

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

此方法在檢視呈現後但佈局呈現開始之前呼叫。

5

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

此方法在佈局呈現開始之前呼叫。這將接收佈局檔名作為引數。

6

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

此方法在佈局呈現完成後呼叫。這將接收佈局檔名作為引數。

CakePHP - 資料庫操作

在 CakePHP 中使用資料庫非常容易。我們將在本章中瞭解 CRUD(建立、讀取、更新、刪除)操作。

此外,我們還需要在 **config/app_local.php 檔案**中配置我們的資料庫。

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

預設連線具有以下詳細資訊:

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

您可以根據自己的選擇更改詳細資訊,即主機、使用者名稱、密碼和資料庫。

完成後,請確保它已在 config/app_local.php 的 Datasources 物件中更新。

現在,我們將繼續使用上述詳細資訊,轉到您的 phpmyadmin 或 mysql 資料庫,並建立名為 my_app 的使用者,如下所示:

My App

授予必要的許可權並儲存。現在,我們根據 app_local.php 中提到的配置擁有資料庫詳細資訊。當您檢查 CakePHP 首頁時,您應該會看到以下內容:

App Local

現在,我們將在資料庫中建立以下 users 表。

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

插入記錄

要在資料庫中插入記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。

此新例項用於建立新實體。使用新實體的例項設定必要的值。我們現在必須使用 **TableRegistry** 類的例項呼叫 **save()** 方法,這將向資料庫插入新記錄。

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/controller/UsersController.php

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

在 **src/Template** 目錄下建立一個名為 **Users** 的目錄,並在該目錄下建立一個名為 add.php 的**檢視**檔案。將以下程式碼複製到該檔案中。

src/Template/Users/add.php

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

訪問以下 URL https:///cakephp4/users/add 執行上述示例。

輸出

執行後,您將收到以下輸出。

Added

資料將儲存到 users 表中,如下所示:

Show All

CakePHP - 檢視記錄

要檢視資料庫記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。

現在,此新例項用於使用 find() 方法從資料庫查詢記錄。此方法將返回請求表中的所有記錄。

示例

按以下程式碼所示更改 **config/routes.php** 檔案。

config/routes.php

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

在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/controller/UsersController.php

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

在 **src/Template** 目錄下建立一個名為 **Users** 的目錄(如果已建立則忽略),並在該目錄下建立一個名為 **index.php** 的**檢視**檔案。將以下程式碼複製到該檔案中。

src/Template/Users/index.ctp

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

訪問以下 URL https:///cakephp4/users 執行上述示例。

輸出

執行後,上述 URL 將給出以下輸出。

Upon Execution

CakePHP - 更新記錄

要在資料庫中更新記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。現在,此新例項用於獲取我們要更新的特定記錄。

使用此新例項呼叫 **get()** 方法,並傳遞主鍵以查詢將儲存到另一個例項中的記錄。使用此例項設定要更新的新值,然後最終使用 **TableRegistry** 類的例項呼叫 **save()** 方法以更新記錄。

示例

按以下程式碼所示更改 config/routes.php 檔案。

config/routes.php

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

在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/controller/UsersController.php

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

在 **src/Template** 目錄下建立一個名為 **Users** 的目錄(如果已建立則忽略),並在該目錄下建立一個名為 **index.php** 的檢視。將以下程式碼複製到該檔案中。

src/Template/Users/index.php

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

在 Users 目錄下建立另一個名為 **edit.php** 的**檢視**檔案,並將以下程式碼複製到其中。

src/Template/Users/edit.php

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

訪問以下 URL 並單擊**編輯連結**以編輯記錄來執行上述示例。

https:///cakephp4/users

輸出

訪問上述 URL 後,它將顯示 users 表中的記錄,如下所示:

After Visiting

單擊“編輯”按鈕,將顯示以下螢幕:

Edit Button

現在,我們將名稱 Virat 更新為 Virat123 並提交詳細資訊。顯示的下一個螢幕如下所示:

Virat

CakePHP - 刪除記錄

要在資料庫中刪除記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。get() 方法將資料庫表的名稱作為引數。現在,此新例項用於獲取我們要刪除的特定記錄。

使用此新例項呼叫get()方法,並傳遞主鍵來查詢記錄,該記錄將儲存到另一個例項中。使用 TableRegistry 類的例項呼叫delete方法從資料庫中刪除記錄。

示例

按以下程式碼所示更改 config/routes.php 檔案。

config/routes.php

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

在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。

src/controller/UsersController.php

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

只需在Users目錄下建立一個名為delete.ctp的空View檔案。

src/Template/Users/delete.ctp

src/Template目錄下建立Users目錄(如果已建立則忽略),然後在該目錄下建立一個名為index.ctpView檔案。將以下程式碼複製到該檔案中。

src/Template/Users/index.ctp

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

訪問以下URL並單擊刪除連結來刪除記錄,以執行上述示例。

https://:85/CakePHP/users

輸出

訪問上述URL並單擊刪除連結後,您將收到以下輸出,您可以在其中刪除記錄。

Delete Link

單擊刪除連結以刪除記錄。

User Deleted

CakePHP - 服務

本章介紹CakePHP中提供的身份驗證過程資訊。

身份驗證

身份驗證是識別正確使用者的過程。CakePHP支援三種身份驗證型別。

  • FormAuthenticate − 它允許您基於表單 POST 資料對使用者進行身份驗證。通常,這是一個使用者輸入資訊的登入表單。這是預設的身份驗證方法。

  • BasicAuthenticate − 它允許您使用基本 HTTP 身份驗證對使用者進行身份驗證。

  • DigestAuthenticate − 它允許您使用摘要 HTTP 身份驗證對使用者進行身份驗證。

FormAuthentication 示例

按以下程式碼所示更改 config/routes.php 檔案。

config/routes.php

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

更改AppController.php檔案的程式碼,如下面的程式所示。

src/Controller/AppController.php

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

src/Controller/AuthexsController.php處建立AuthexsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/AuthexsController.php

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

src/Template目錄下建立Authexs目錄,然後在該目錄下建立一個名為login.phpView檔案。將以下程式碼複製到該檔案中。

src/Template/Authexs/login.php

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

建立另一個名為logout.phpView檔案。將以下程式碼複製到該檔案中。

src/Template/Authexs/logout.php

You are successfully logged out.

建立另一個名為index.phpView檔案。將以下程式碼複製到該檔案中。

src/Template/Authexs/index.php

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

透過訪問以下 URL 來執行上述示例。

https:///cakephp4/auth

輸出

由於已實現身份驗證,因此當您嘗試訪問上述URL時,您將被重定向到如下所示的登入頁面。

Authentication

提供正確的憑據後,您將登入並重定向到如下所示的螢幕。

Redirected

單擊登出連結後,您將再次被重定向到登入螢幕。

CakePHP - 錯誤和異常處理

為了系統的順利執行,需要有效地處理系統的故障。CakePHP帶有預設的錯誤陷阱,它會在錯誤發生時列印和記錄錯誤。相同的錯誤處理程式用於捕獲異常

當debug為true時,錯誤處理程式顯示錯誤,當debug為false時,錯誤處理程式記錄錯誤。CakePHP有很多異常類,內建的異常處理將捕獲任何未捕獲的異常並呈現有用的頁面。

錯誤和異常配置

錯誤和異常可以在config\app.php檔案中配置。錯誤處理接受一些選項,允許您為您的應用程式定製錯誤處理 -

選項 資料型別 描述
errorLevel int

您感興趣的捕獲錯誤的級別。使用內建的php錯誤常量和位掩碼來選擇您感興趣的錯誤級別。

trace bool

在日誌檔案中包含錯誤的堆疊跟蹤。堆疊跟蹤將在每個錯誤後包含在日誌中。這有助於查詢錯誤的發生位置/時間。

exceptionRenderer string

負責呈現未捕獲異常的類。如果您選擇一個自定義類,則應將該類的檔案放在src/Error中。此類需要實現一個render()方法。

日誌 bool

如果為true,異常及其堆疊跟蹤將記錄到Cake\Log\Log

skipLog array

不應該記錄的異常類名的陣列。這對於刪除NotFoundExceptions或其他常見但無趣的日誌訊息很有用。

extraFatalErrorMemory int

遇到致命錯誤時,設定為增加記憶體限制的兆位元組數。這允許有足夠的餘地來完成日誌記錄或錯誤處理。

示例

按以下程式碼所示更改 **config/routes.php** 檔案。

config/routes.php

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

src/Controller/ExpsController.php處建立ExpsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/ExpsController.php

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

src/Template目錄下建立Exps目錄,然後在該目錄下建立一個名為index.php的View檔案。將以下程式碼複製到該檔案中。

src/Template/Exps/index.php

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

透過訪問以下 URL 來執行上述示例。

https:///cakephp4/exception/5/0

輸出

執行後,您將收到以下輸出。

Arguments

CakePHP - 日誌記錄

在CakePHP中進行日誌記錄是一項非常簡單的任務。您只需要使用一個函式。您可以記錄錯誤、異常、使用者活動、使用者採取的操作以及任何後臺程序(如cronjob)。在CakePHP中記錄資料很容易。log()函式由LogTrait提供,LogTrait幾乎是所有CakePHP類的共同祖先。

日誌記錄配置

我們可以在config/app.php檔案中配置日誌。該檔案中有一個日誌部分,您可以在其中配置日誌記錄選項,如下面的螢幕截圖所示。

Programming

預設情況下,您將看到已經為您配置的兩個日誌級別 - errordebug。每個級別都將處理不同級別的訊息。

CakePHP支援各種日誌記錄級別,如下所示:

  • Emergency − 系統無法使用

  • Alert − 必須立即採取行動

  • Critical − 嚴重情況

  • Error − 錯誤情況

  • Warning − 警告情況

  • Notice − 正常但重要的條件

  • Info − 資訊訊息

  • Debug − 除錯級別訊息

寫入日誌檔案

我們可以透過兩種方式向日志文件寫入內容。

第一種是使用靜態write()方法。以下是靜態write()方法的語法。

語法 write( integer|string $level, mixed $message, string|array $context [] )
引數

正在寫入的訊息的嚴重級別。該值必須是整數或與已知級別匹配的字串。

要記錄的訊息內容。

用於記錄訊息的其他資料。可以傳遞特殊的範圍鍵以用於進一步過濾要使用的日誌引擎。如果傳遞字串或數字索引陣列,則將被視為範圍鍵。有關日誌範圍的更多資訊,請參見Cake\Log\Log::config()

返回值

boolean

描述

將給定的訊息和型別寫入所有已配置的日誌介面卡。已配置的介面卡同時傳遞$level和$message變數。$level是以下字串/值之一。

第二種是使用任何使用LogTraitlog()快捷方式函式。呼叫log()將在內部呼叫Log::write() -

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

src/Controller/LogexsController.php處建立LogexsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/LogexsController.php

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

src/Template目錄下建立Logexs目錄,然後在該目錄下建立一個名為index.php的View檔案。將以下程式碼複製到該檔案中。

src/Template/Logexs/index.php

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

透過訪問以下 URL 來執行上述示例。

https:///cakephp4/logex

輸出

執行後,您將收到以下輸出。

Debugs

日誌將新增到log/debug.log檔案中 -

Logfile

CakePHP - 表單處理

CakePHP提供各種內建標籤來輕鬆安全地處理HTML表單。與許多其他PHP框架一樣,HTML的主要元素也是使用CakePHP生成的。以下是用於生成HTML元素的各種函式。

以下函式用於生成選擇選項 -

語法 _selectOptions( array $elementsarray(), array $parentsarray(), boolean $showParentsnull, array $attributesarray() )
引數
  • 要格式化的元素

  • OPTGROUP 的父級

  • 是否顯示父級

  • HTML 屬性

返回值 array
描述 返回格式化的OPTION/OPTGROUP元素陣列

以下函式用於生成HTML select元素

語法 select( string $fieldName, array $options array(), array $attributes array() )
引數

SELECT 的 name 屬性

要在SELECT元素中使用的OPTION元素陣列(作為'value'=>'Text'對)。

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

以下函式用於在HTML頁面上生成按鈕

語法

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

引數
  • 按鈕的標題。不會自動進行HTML編碼。

  • 選項和HTML屬性陣列

返回值 HTML按鈕標籤。
描述

建立一個<button>標籤。type屬性預設為type="submit"。您可以使用$options['type']將其更改為不同的值。

以下函式用於在HTML頁面上生成複選框

語法 Checkbox(string $fieldName, array $optionsarray() )
引數
  • 欄位名稱,例如“Modelname.fieldname”

  • HTML屬性陣列。可能的選項包括value、checked、hiddenField、disabled、default。

返回值 HTML文字輸入元素。
描述 建立一個複選框輸入控制元件。

以下函式用於在HTML頁面上建立表單

語法 create( mixed $modelnull , array $optionsarray() )
引數
  • 定義表單的模型名稱。應包含外掛模型的外掛名稱,例如ContactManager.Contact。如果傳遞陣列並且$options引數為空,則該陣列將用作選項。如果為false,則不使用模型。

  • html屬性和選項陣列。可能的選項包括type、action、url、default、onsubmit、inputDefaults、encoding。

返回值

格式化的FORM起始標籤。

描述 返回HTML FORM元素。

以下函式用於在HTML頁面上提供檔案上傳功能

語法

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

引數
  • 欄位名稱,格式為“Modelname.fieldname”

  • HTML屬性陣列。

返回值

生成的file輸入。

描述

建立檔案輸入控制元件。

以下函式用於在HTML頁面上建立隱藏元素

語法

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

引數
  • 欄位名稱,格式為“Modelname.fieldname”

  • HTML屬性陣列。

返回值

生成的隱藏輸入

描述

建立一個隱藏輸入欄位

以下函式用於在HTML頁面上生成輸入元素

語法

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

引數
  • 這應該是“Modelname.fieldname”

  • 每種型別的輸入都採用不同的選項

返回值

完整的表單控制元件

描述

生成一個包含標籤和包裝div的表單輸入元素

以下函式用於在HTML頁面上生成單選按鈕

語法

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

引數
  • 欄位名稱,例如“Modelname.fieldname”

  • 單選按鈕選項陣列。

  • HTML屬性陣列以及上述特殊屬性。

返回值 完整的單選控制元件集
描述 建立一組單選控制元件。預設情況下將建立圖例和欄位集。使用$options控制此操作。

以下函式用於在HTML頁面上生成提交按鈕。

語法 Submit(string $caption null, array $options array() )
引數
  • 顯示在按鈕上的標籤,或者如果字串包含://或副檔名.jpg、.jpe、.jpeg、.gif、.png。如果存在副檔名,並且第一個字元為/,則使用影像,影像相對於webroot,或者如果第一個字元不為/,則影像相對於webroot/img。

  • 選項陣列。可能的選項包括div、before、after、type等。

返回值

HTML提交按鈕

描述 建立一個提交按鈕元素。此方法將生成<input />元素,可以使用$options提交和重置表單。可以透過為$caption提供影像路徑來建立影像提交。

以下函式用於在HTML頁面上生成textarea元素

語法

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

引數
  • 欄位名稱,格式為“Modelname.fieldname”

  • HTML屬性陣列,特殊選項如escape

返回值 生成的HTML文字輸入元素
描述 建立文字區域小部件

示例

按以下程式碼所示更改 **config/routes.php** 檔案。

config/routes.php

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

在以下位置建立一個**RegistrationsController.php**檔案:

**src/Controller/RegistrationsController.php。** 將以下程式碼複製到控制器檔案中。

src/Controller/RegistrationsController.php

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

在**src/Template**目錄下建立一個**Registrations**目錄,並在該目錄下建立一個名為**index.php**的**View**檔案。將以下程式碼複製到該檔案中。

src/Template/Registrations/index.php

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/register

輸出

執行後,您將收到以下輸出。

Condition

CakePHP - 國際化

像許多其他框架一樣,CakePHP也支援國際化。我們需要遵循以下步驟才能從單一語言過渡到多種語言。

步驟 1

建立一個單獨的語言環境目錄resources\**locales**。

步驟 2

在src\Locale目錄下為每種語言建立子目錄。子目錄的名稱可以是語言的兩位字母ISO程式碼或完整的語言環境名稱,例如en_US、fr_FR等。

步驟 3

在每個語言子目錄下建立一個單獨的**default.po**檔案。此檔案包含以**msgid**和**msgstr**形式的條目,如下面的程式所示。

msgid "msg"
msgstr "CakePHP Internationalization example."

這裡,**msgid**是將在View模板檔案中使用的鍵,**msgstr**是儲存翻譯的值。

步驟 4

在View模板檔案中,我們可以使用上面的**msgid**,如下所示,它將根據語言環境的設定值進行翻譯。

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

預設語言環境可以透過以下行在**config/app.php**檔案中設定。

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

要在執行時更改語言環境,可以使用以下幾行程式碼。

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

示例

按以下程式所示更改 config/routes.php 檔案。

config/routes.php

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

在**src/Controller/LocalizationsController.php**位置建立一個**LocalizationsController.php**檔案。將以下程式碼複製到控制器檔案中。

src/Controller/LocalizationsController.php

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

在resources\**locales**目錄下建立一個**locales**目錄。在locales目錄下建立3個名為**en_US、fr_FR、de_DE**的目錄。在每個目錄下建立一個名為**default.po**的檔案。將以下程式碼複製到相應的檔案中。

resources/locales/en_US/default.po

msgid "msg"
msgstr "CakePHP Internationalization example."

resources/locales/fr_FR/default.po

msgid "msg"
msgstr "Exemple CakePHP internationalisation."

resources/locales/de_DE/default.po

msgid "msg"
msgstr "CakePHP Internationalisierung Beispiel."

在**src/Template**目錄下建立一個**Localizations**目錄,並在該目錄下建立一個名為**index.php**的**View**檔案。將以下程式碼複製到該檔案中。

src/Template/Localizations/index.php

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

透過訪問以下URL來執行上述示例。https:///cakephp4/locale

輸出

執行後,您將收到以下輸出。

English

電子郵件

CakePHP提供Email類來管理與電子郵件相關的功能。要在任何控制器中使用電子郵件功能,首先需要透過編寫以下行來載入Email類。

use Cake\Mailer\Email;

Email類提供各種有用的方法,如下所述。

語法

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

引數
  • 包含電子郵件的字串

  • 姓名

返回值

array|$this

描述

它指定將從哪個電子郵件地址傳送電子郵件

語法

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

引數
  • 包含電子郵件的字串

  • 姓名

返回值

array|$this

描述

它指定將向誰傳送電子郵件

語法

Send(string|array|null $contentnull)

引數
  • 包含訊息的字串或包含訊息的陣列。

返回值 array
描述

使用指定的內容、模板和佈局傳送電子郵件

語法

Subject(string|null $subjectnull)

引數
  • 主題字串

返回值

array|$this

描述

獲取/設定主題

語法

Attachments(string|array|null $attachmentsnull)

引數
  • 包含檔名的字串或包含檔名的陣列

返回值

array|$this

描述

向電子郵件訊息新增附件

語法

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

引數
  • 包含電子郵件的字串

  • 姓名

返回值

array|$this

描述

密件抄送

語法

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

引數
  • 包含電子郵件的字串

  • 姓名

返回值

array|$this

描述

抄送

示例

按以下程式所示更改 config/routes.php 檔案。

config/routes.php

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

在**src/Controller/EmailsController.php**位置建立一個**EmailsController.php**檔案。將以下程式碼複製到控制器檔案中。

src/Controller/EmailsController.php

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

在**src/Template**目錄下建立一個**Emails**目錄,並在該目錄下建立一個名為**index.php**的View檔案。將以下程式碼複製到該檔案中。

src/Template/Emails/index.php

Email Sent.

在傳送任何電子郵件之前,我們需要對其進行配置。在下圖中,您可以看到有兩個傳輸方式,預設方式和Gmail方式。我們使用了Gmail傳輸方式。

您需要將“GMAIL使用者名稱”替換為您的Gmail使用者名稱,並將“應用密碼”替換為您的應用程式密碼。您需要在Gmail中啟用兩步驗證並建立一個新的應用密碼才能傳送電子郵件。

config/app.php

Program App

透過訪問以下URL來執行上述示例:https:///cakephp/email

輸出

執行後,您將收到以下輸出。

Documents Api

CakePHP - 會話管理

會話允許我們跨請求管理唯一使用者,併為特定使用者儲存資料。會話資料可以在任何地方訪問,任何您可以訪問請求物件的地方,即會話可以從控制器、檢視、輔助程式、單元和元件訪問。

訪問會話物件

可以透過執行以下程式碼來建立會話物件。

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

寫入會話資料

要向會話中寫入內容,我們可以使用**write()**會話方法。

Session::write($key, $value)

上述方法將採用兩個引數:**值**和**鍵**,值將儲存在該鍵下。

示例

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

讀取會話資料

要從會話中檢索儲存的資料,我們可以使用**read()**會話方法。

Session::read($key)

上述函式只接受一個引數,即寫入會話資料時使用的**值的鍵**。一旦提供了正確的鍵,函式將返回其值。

示例

$session->read('name');

當您想檢查特定資料是否存在於會話中時,可以使用**check()**會話方法。

Session::check($key)

上述函式只接受鍵作為引數。

示例

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

刪除會話資料

要從會話中刪除資料,我們可以使用**delete()**會話方法來刪除資料。

Session::delete($key)

上述函式只接受要從會話中刪除的值的鍵。

示例

$session->delete('name');

當您想讀取然後從會話中刪除資料時,可以使用**consume()**會話方法。

static Session::consume($key)

上述函式只接受鍵作為引數。

示例

$session->consume('name');

銷燬會話

當用戶從站點登出時,我們需要銷燬使用者會話,並且要銷燬會話,可以使用**destroy()**方法。

Session::destroy()

示例

$session->destroy();

銷燬會話將從伺服器中刪除所有會話資料,但不會刪除會話cookie。

更新會話

在您想更新使用者會話的情況下,我們可以使用**renew()**會話方法。

Session::renew()

示例

$session->renew();

完整會話

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
   $builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
      'httpOnly' => true,
   ]));
   $builder->applyMiddleware('csrf');
   //$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
   $builder->connect('/session-object',['controller'=>'Sessions','action'=>'index']);
   $builder->connect('/session-read',['controller'=>'Sessions','action'=>'retrieve_session_data']);
   $builder->connect('/session-write',['controller'=>'Sessions','action'=> 'write_session_data']);
   $builder->connect('/session-check',['controller'=>'Sessions','action'=>'check_session_data']);
   $builder->connect('/session-delete',['controller'=>'Sessions','action'=>'delete_session_data']);
   $builder->connect('/session-destroy',['controller'=>'Sessions','action'=>'destroy_session_data']);
   $builder->fallbacks();
});

在**src/Controller/SessionsController.php**位置建立一個**SessionsController.php**檔案。將以下程式碼複製到控制器檔案中

src/Controller/SessionsController.php

<?php
namespace App\Controller;
use App\Controller\AppController;
   class SessionsController extends AppController {
   public function retrieveSessionData() {
      //create session object
      $session = $this->request->getSession();
      //read data from session
      $name = $session->read('name');
      $this->set('name',$name);
   }
   public function writeSessionData(){
      //create session object
      $session = $this->request->getSession();
      //write data in session
      $session->write('name','Virat Gandhi');
   }
   public function checkSessionData(){
      //create session object
      $session = $this->request->getSession();
      //check session data
      $name = $session->check('name');
      $address = $session->check('address');
      $this->set('name',$name);
      $this->set('address',$address);
   }
   public function deleteSessionData(){
      //create session object
      $session = $this->request->getSession();
      //delete session data
      $session->delete('name');
   }
   public function destroySessionData(){
      //create session object
      $session = $this->request->getSession();
      //destroy session
      $session->destroy();
   }
}
?>

在**src/Template**目錄下建立一個**Sessions**目錄,並在該目錄下建立一個名為**write_session_data.php**的**View**檔案。將以下程式碼複製到該檔案中。

src/Template/Sessions/write_session_data.php

The data has been written in session.

在同一個**Sessions**目錄下建立另一個名為**retrieve_session_data.php**的**View**檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/retrieve_session_data.php

Here is the data from session.
Name: <?=$name;?>

在同一個Sessions目錄下建立另一個名為**check_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/check_session_data.ctp

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

在同一個Sessions目錄下建立另一個名為**delete_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/delete_session_data.ctp

Data deleted from session.

在同一個Sessions目錄下建立另一個名為**destroy_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。

src/Template/Sessions/destroy_session_data.ctp

Session Destroyed.

輸出

透過訪問以下URL來執行上述示例。此URL將幫助您向會話中寫入資料。

https:///cakephp4/session-write

Written in Session

訪問以下URL**以讀取會話資料:https:///cakephp4/session-read**

Name

訪問以下URL**以檢查會話資料:https:///cakephp4/session-check**

Name Exists

訪問以下URL**以刪除會話資料:https:///cakephp4/session-delete** 訪問以下URL

Delete From Session

訪問以下URL**以銷燬會話資料:https:///cakephp4/session-destroy**

Destroyed

CakePHP - Cookie 管理

使用CakePHP處理Cookie很容易且安全。有一個CookieComponent類用於管理Cookie。該類提供了幾種處理Cookie的方法。

要使用cookie,請將這兩個類新增到您的控制器中:

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

必須首先建立cookie物件才能註冊cookie。

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

名稱和值是必須的,其他引數是可選的。

寫入Cookie

以下是寫入cookie的語法。

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

建立的cookie必須新增到cookieCollection中,如下所示:

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

如果cookie collection物件已經建立,則可以新增其餘cookie,如下所示:

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

讀取Cookie

要讀取cookie,請使用cookiecollection的get()方法。

語法

讀取cookie的語法如下:

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

這將返回cookiecollection介面,要獲取cookie的值,您必須呼叫getValue()方法。

Cake\Http\Cookie\CookieCollection Interface::getValue()

檢查Cookie

cookieCollection的**has()**方法將告訴您cookie是否存在。

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

示例

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

刪除Cookie

**remove()**方法用於刪除cookie。以下是remove()方法的語法。

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

remove()方法將接受一個引數,即要刪除的cookie變數的名稱($name)。

示例 1

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

示例 2

按以下程式所示更改 config/routes.php 檔案。

config/routes.php

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

在**src/Controller/CookiesController.php**位置建立一個**CookiesController.php**檔案。將以下程式碼複製到控制器檔案中。

src/Controller/Cookies/CookiesController.php

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

在**src/Template**目錄下建立一個**Cookies**目錄,並在該目錄下建立一個名為**test_cookies.php**的**View**檔案。將以下程式碼複製到該檔案中。

src/Template/Cookie/test_cookies.php

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

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

輸出

透過訪問以下URL來執行上述示例:https:///cakephp4/cookie/testcookies

Cookie

CakePHP - 安全性

安全性是構建Web應用程式時另一個重要功能。它向網站使用者保證他們的資料是安全的。CakePHP提供了一些工具來保護您的應用程式。

加密和解密

CakePHP中的安全庫提供了一些方法,我們可以透過這些方法來加密和解密資料。以下是用於同一目的的兩種方法。

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

encrypt方法將接受文字和金鑰作為引數來加密資料,返回值將是帶有HMAC校驗和的加密值。

要雜湊資料,可以使用**hash()**方法。以下是hash()方法的語法。

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

CSRF

CSRF代表**跨站點請求偽造**。透過啟用CSRF元件,您可以獲得針對攻擊的保護。CSRF是Web應用程式中常見的漏洞。

它允許攻擊者捕獲並重播之前的請求,有時使用其他域上的影像標籤或資源提交資料請求。可以透過簡單地將**CsrfComponent**新增到您的元件陣列中來啟用CSRF,如下所示:

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

CsrfComponent與**FormHelper**無縫整合。每次使用FormHelper建立表單時,它都會插入一個包含CSRF令牌的隱藏欄位。

雖然不推薦這樣做,但您可能希望在某些請求上停用CsrfComponent。您可以透過在**beforeFilter()**方法期間使用控制器的事件排程程式來做到這一點。

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

安全元件

安全元件為您的應用程式應用更嚴格的安全策略。它提供用於各種任務的方法,例如:

  • 限制應用程式接受的HTTP方法 – 在執行副作用之前,應始終驗證正在使用的HTTP方法。應檢查HTTP方法或使用Cake\Network\Request::allowMethod()來確保使用了正確的HTTP方法。

  • 表單篡改保護 – 預設情況下,SecurityComponent 可防止使用者以特定方式篡改表單。SecurityComponent 將阻止以下行為:

    • 無法向表單新增未知欄位。

    • 無法從表單中刪除欄位。

    • 無法修改隱藏輸入中的值。

  • 要求使用SSL – 所有操作都需要SSL安全連線。

  • 限制跨控制器通訊 – 我們可以限制哪些控制器可以向此控制器傳送請求。我們還可以限制哪些操作可以向此控制器的操作傳送請求。

示例

按照以下程式所示修改 **config/routes.php** 檔案。

config/routes.php

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

src/Controller/LoginsController.php處建立一個LoginsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/LoginsController.php

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

src/Template處建立一個名為Logins的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Logins/index.php

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

透過訪問以下URL執行上述示例:https:///cakephp4/login

輸出

執行後,您將收到以下輸出。

Submit Login

CakePHP - 驗證

在製作網站時,通常需要在進一步處理資料之前驗證某些內容。CakePHP 提供了驗證包,可以輕鬆構建用於驗證資料的驗證器。

驗證方法

CakePHP在Validation類中提供了各種驗證方法。下面列出了一些最常用的方法。

語法

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

引數
  • 將新增規則的欄位名稱。

  • 單個規則或多個規則陣列的別名。

  • 要新增的規則。

返回值

$this

描述

向欄位的規則集中新增新規則。如果第二個引數是陣列,則該欄位的規則列表將被第二個引數替換,而第三個引數將被忽略。

語法

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

引數
  • 欄位的名稱。

  • 指示允許欄位為空的時間。有效值為true(始終)、'create'、'update'。如果傳遞了一個可呼叫物件,則只有當回撥返回true時,欄位才會保持為空。

  • 如果欄位不為空,則顯示的訊息。

返回值 $this
描述

允許欄位為空。

語法

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

引數
  • 要應用規則的欄位。

  • 規則失敗時的錯誤訊息。

  • 'create' 或 'update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增字母數字規則。

語法

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

引數
  • 要應用規則的欄位。

  • 要允許的卡型別。預設為“all”。您還可以提供一個已接受卡型別的陣列,例如['mastercard', 'visa', 'amex']。

  • 規則失敗時的錯誤訊息。

  • 'create' 或 'update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增信用卡規則。

語法

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

引數
  • 要應用規則的欄位。

  • 是否檢查MX記錄。

  • 規則失敗時的錯誤訊息。

  • 'create' 或 'update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增電子郵件驗證規則。

語法

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

引數
  • 要應用規則的欄位。

  • 允許的最大長度。

  • 規則失敗時的錯誤訊息。

  • 'create''update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增字串長度驗證規則。

語法

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

引數
  • 要應用規則的欄位。

  • 允許的最大長度。

  • 規則失敗時的錯誤訊息。

  • 'create''update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增字串長度驗證規則。

語法

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

引數
  • 要應用規則的欄位。

  • 規則失敗時的錯誤訊息。

  • 'create''update' 或一個可呼叫物件,當應應用驗證規則時返回 true。

返回值

$this

描述

向欄位新增notBlank規則。

CakePHP - 建立驗證器

可以透過在控制器中新增以下兩行來建立驗證器。

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

驗證資料

建立驗證器後,我們可以使用驗證器物件來驗證資料。以下程式碼說明了如何驗證登入網頁的資料。

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

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

使用$validator物件,我們首先呼叫了notEmpty()方法,這將確保使用者名稱不能為空。之後,我們連結了add()方法以新增另一個用於正確電子郵件格式的驗證。

之後,我們使用notEmpty()方法為密碼欄位添加了驗證,這將確認密碼欄位不能為空。

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/ValidsController.php處建立一個ValidsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/ValidsController.php

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

src/Template處建立一個名為Valids的目錄,並在該目錄下建立一個名為index.php檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Valids/index.php

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/validation

輸出

點選提交按鈕而不輸入任何內容。您將收到以下輸出。

Click PHP

Http客戶端

http客戶端可用於發出GET、POST、PUT等請求。

要使用http客戶端,請新增以下內容:

use Cake\Http\Client;

讓我們來看一個例子來理解HTTP客戶端的工作原理。

HTTP GET方法

要從給定的http url獲取資料,您可以執行以下操作:

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

如果您需要傳遞一些查詢引數,則可以按如下方式傳遞:

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

要獲取響應,您可以執行以下操作:

對於普通文字資料

$response->getBody();

對於Json

$response->getJson();

對於Xml

$response->getXml()

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/RequestsController.php處建立一個RequestsController.php檔案。將以下程式碼複製到控制器檔案中。

src/Controller/RequestsController.php

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

src/Template處建立一個名為Requests的目錄,並在該目錄下建立一個名為index.php檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Requests/index.php

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/getData

輸出

點選提交按鈕而不輸入任何內容。您將收到以下輸出。

Users URL

HTTP POST方法

要使用post,您需要按如下方式呼叫$http客戶端:

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

讓我們來看一個相同的例子。

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/RequestsController.php處建立一個RequestsController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。

src/Controller/RequestsController.php

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

src/Template處建立一個名為Requests的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Requests/index.php

<h3>Testing Post Method</h3>

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/postData

輸出

以下是程式碼的輸出:

Post Method

同樣,您可以嘗試PUT方法。

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

CakePHP - 分頁

如果我們要顯示大量資料,可以使用分頁功能,CakePHP 4 提供了這個非常易於使用的功能。

我們有一個名為“articles”的表,包含以下資料:

Options

讓我們使用分頁功能以頁面的形式顯示資料,而不是一次性顯示所有資料。

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/PostsController.php處建立一個PostsController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。

src/Controller/PostsController.php

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

使用以下方法獲取articles表中的資料:

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

要應用分頁,我們將每頁顯示3條記錄,方法如下:

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

這足以啟用articles表的分頁功能。

src/Template處建立一個名為Posts的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Posts/index.php

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

頁碼列表的分頁如下所示:

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/posts

輸出

執行程式碼後,您將看到以下輸出:

Article

點選下面的數字切換到下一頁,或使用下一頁或上一頁按鈕。

例如

Article1

您將看到page=2已附加到瀏覽器中的頁面URL。

CakePHP - 日期和時間

要在cakephp4中使用日期和時間,我們將使用可用的FrozenTime類。

要使用日期和時間,請在您的控制器中包含該類。

use Cake\I18n\FrozenTime;

讓我們來看一個例子,使用FrozenTime類顯示日期和時間。

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/DatesController.php處建立一個DatesController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。

src/Controller/DatesController.php

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

src/Template處建立一個名為Dates的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Dates/index.php

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

透過訪問以下 URL 來執行上述示例:

https:///cakephp4/datetime

輸出

執行程式碼後,您將看到以下輸出:

Current Date

CakePHP - 檔案上傳

要進行檔案上傳,我們將使用表單助手。這是一個檔案上傳的示例。

示例

按照以下程式所示,更改config/routes.php檔案。

config/routes.php

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

src/Controller/FilesController.php處建立一個FilesController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。

在src/中建立uploads/目錄。上傳的檔案將儲存在uploads/資料夾中。

src/Controller/FilesController.php

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

src/Template處建立一個名為Files的目錄,並在該目錄下建立一個名為index.php檢視檔案。將以下程式碼複製到該檔案中。

src/Template/Files/index.php

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

為使用者列出儲存在uploads/資料夾中的檔案。透過訪問以下URL執行上述示例:

https:///cakephp4/fileupload

輸出

執行上述程式碼後,您應該看到以下輸出:

Choose File
廣告
© . All rights reserved.