- CakePHP 教程
- CakePHP - 首頁
- CakePHP - 概述
- CakePHP - 安裝
- CakePHP - 資料夾結構
- CakePHP - 專案配置
- CakePHP - 路由
- CakePHP - 控制器
- CakePHP - 檢視
- CakePHP - 擴充套件檢視
- CakePHP - 檢視元素
- CakePHP - 檢視事件
- CakePHP - 資料庫操作
- CakePHP - 檢視記錄
- CakePHP - 更新記錄
- CakePHP - 刪除記錄
- CakePHP - 服務
- CakePHP - 錯誤和異常處理
- CakePHP - 日誌記錄
- CakePHP - 表單處理
- CakePHP - 國際化
- CakePHP - 會話管理
- CakePHP - Cookie 管理
- CakePHP - 安全性
- CakePHP - 驗證
- CakePHP - 建立驗證器
- CakePHP - 分頁
- CakePHP - 日期和時間
- CakePHP - 檔案上傳
- CakePHP 有用資源
- CakePHP 快速指南
- CakePHP - 有用資源
- CakePHP - 討論
CakePHP 快速指南
CakePHP - 概述
CakePHP是一個開源的MVC框架。它使開發、部署和維護應用程式更容易。CakePHP擁有一些庫來減少大多數常見任務的負擔。
CakePHP 的優點
使用 CakePHP 的優點如下:
開源
MVC 框架
模板引擎
快取操作
搜尋引擎友好的 URL
簡單的 CRUD(建立、讀取、更新、刪除)資料庫互動。
庫和助手
內建驗證
本地化
電子郵件、Cookie、安全、會話和請求處理元件
用於 AJAX、JavaScript、HTML 表單等的檢視助手
CakePHP 請求週期
下圖描述了 CakePHP 中請求生命週期的工作方式:
典型的 CakePHP 請求週期從使用者請求應用程式中的頁面或資源開始。在高層次上,每個請求都經過以下步驟:
Web 伺服器重寫規則將請求定向到 webroot/index.php。
執行應用程式的自動載入器和引導檔案。
任何已配置的排程過濾器都可以處理請求,並可以選擇生成響應。
排程程式根據路由規則選擇合適的控制器和操作。
呼叫控制器的操作,控制器與所需的模型和元件互動。
控制器將響應建立委託給檢視以生成模型資料產生的輸出。
檢視使用助手和單元生成響應正文和標頭。
響應被髮送回客戶端。
CakePHP - 安裝
本章將演示 CakePHP 4.0.3 的安裝。我們需要安裝的最低 PHP 版本是PHP 7.3。
在開始安裝 CakePHP 之前,您需要安裝 PHP 7.3 和 Composer。
對於Windows使用者,請安裝或更新 PHP 版本 > 7.3 的 WAMP 伺服器。
訪問www.wampserver.com/en/download-wampserver-64bits/並安裝它。
對於 Linux 使用者,請參考 Tutorials Point 網站 www.tutorialspoint.com/php7/php7_installation_linux.htm,瞭解 PHP 的安裝方法。
安裝 Composer
訪問 Composer 網站 https://getcomposer.org/download/,根據您的計算機作業系統 (OS) 點選下載,並在您的系統上安裝 Composer。對於 Windows 使用者,請將位置新增到 PATH 變數,以便您可以從任何目錄使用 Composer。
安裝 Composer 後,我們現在開始安裝 CakePHP。
安裝 CakePHP
對於 Windows 使用者,轉到 WAMP 所在的資料夾,在 www/ 資料夾中,建立一個資料夾cakephp4/。
對於 Linux 使用者,建立資料夾var/www/html/,然後建立資料夾cakephp4/。
cakephp4/ 是我們將安裝 CakePHP 的資料夾。
使用 Composer 執行以下命令:
composer create-project --prefer-dist cakephp/app:4.0.3 cakephp4
命令執行時,您應該看到以下內容:
安裝完成後,使用 localhost 在瀏覽器中開啟您的專案。
路徑為 https:///cakephp。
CakePHP - 資料夾結構
在這裡,我們將學習 CakePHP 中的資料夾結構和命名約定。讓我們首先了解資料夾結構。
資料夾結構
請檢視以下螢幕截圖。它顯示了 CakePHP 的資料夾結構。
下表描述了 CakePHP 中每個資料夾的作用:
| 序號 | 資料夾名稱和描述 |
|---|---|
| 1 | bin bin 資料夾包含 Cake 控制檯可執行檔案。 |
| 2 | config config 資料夾包含 CakePHP 使用的(少量)配置檔案。資料庫連線詳細資訊、載入程式、核心配置檔案等都應儲存在此處。 |
| 3 | logs logs 資料夾通常包含您的日誌檔案,具體取決於您的日誌配置。 |
| 4 | plugins plugins 資料夾用於儲存應用程式使用的外掛。 |
| 5 | resources 各個語言環境資料夾中的國際化檔案將儲存在此處。例如 locales/en_US。 |
| 6 | src src 資料夾是您施展魔法的地方。這是您的應用程式檔案將被放置的地方,您將在這裡進行大部分應用程式開發。讓我們更仔細地看看 src 內部的資料夾。
|
| 7 | templates Template 此處放置演示檔案:元素、錯誤頁面、佈局和檢視模板檔案。 |
| 8 | tests tests 資料夾是您放置應用程式測試用例的地方。 |
| 9 | tmp tmp 資料夾是 CakePHP 儲存臨時資料的地方。它實際儲存的資料取決於您如何配置 CakePHP,但此資料夾通常用於儲存模型描述以及有時儲存會話資訊。 |
| 10 | vendor vendor 資料夾是安裝 CakePHP 和其他應用程式依賴項的地方。請承諾不要編輯此資料夾中的檔案。如果您修改了核心,我們將無法幫助您。 |
| 11 | webroot webroot 目錄是應用程式的公共文件根目錄。它包含所有您希望公開訪問的檔案。 |
命名約定
命名約定並非強制遵守,但它是一種良好的編碼實踐,並且隨著專案規模的擴大將非常有用。
控制器約定
控制器類名必須是複數、帕斯卡命名法,並且名稱必須以 Controller 結尾。例如,對於 Students 類,控制器的名稱可以是StudentsController。控制器上的公共方法通常作為可透過 Web 瀏覽器訪問的“操作”公開。
例如,/users/view 預設情況下對映到 UsersController 的view()方法。受保護或私有方法無法透過路由訪問。
檔案和類名約定
大多數情況下,我們看到我們的類名和檔名幾乎相同。CakePHP 中也是如此。
例如,StudentsController 類將具有名為 StudentsController.php 的檔案。檔案必須儲存為模組名稱,並儲存在 app 資料夾中的相應資料夾中。
資料庫約定
用於 CakePHP 模型的表,大多數情況下名稱為複數且帶下劃線。
例如,student_details、student_marks。如果欄位名由兩個單片語成,則使用下劃線,例如 first_name、last_name。
模型約定
對於模型,類名根據資料庫表命名,名稱為複數、帕斯卡命名法,並以 Table 結尾。
例如,StudentDetailsTable、StudentMarksTable
檢視約定
對於檢視模板,檔案基於控制器函式。
例如,如果 StudentDetailsController 類具有 showAll() 函式,則檢視模板將命名為 show_all.php 並儲存在 template/yrmodule/show_all.php 中。
CakePHP - 專案配置
本章將瞭解 CakePHP 中的環境變數、常規配置、資料庫配置和電子郵件配置。
配置CakePHP 預設情況下帶有一個配置檔案,我們可以根據需要修改它。為此專門有一個資料夾“config”。CakePHP 提供了不同的配置選項。
讓我們首先了解 CakePHP 中的環境變數。
環境變數
環境變數使您的應用程式在不同的環境中更容易工作。例如,在開發伺服器、測試伺服器、暫存伺服器和生產伺服器環境中。對於所有這些環境,您可以使用env() 函式讀取您需要的環境配置並構建您的應用程式。
在您的 config 資料夾中,您會看到 config/.env.example。此檔案包含所有將根據您的環境更改的變數。首先,您可以在 config 資料夾中建立一個檔案,即 config/.env,並定義這些變數並使用它們。如果您需要任何其他變數,它可以放在該檔案中。
您可以使用 env() 函式讀取您的環境變數,如下所示:
示例
$debug = env('APP_DEBUG', false);
第一個是您想要的環境變數的名稱,第二個值是預設值。如果找不到環境變數的值,則使用預設值。
常規配置
下表描述了各種變數的作用以及它們如何影響您的 CakePHP 應用程式。
| 序號 | 變數名稱和描述 |
|---|---|
| 1 | debug 更改 CakePHP 除錯輸出。 false = 生產模式。不顯示錯誤訊息、錯誤或警告。 true = 顯示錯誤和警告。 |
| 2 | App.namespace 在其中查詢應用程式類名稱空間。 |
| 3 | App.baseUrl 如果您不打算將 Apache 的 mod_rewrite 與 CakePHP 一起使用,請取消此定義的註釋。也不要忘記刪除您的 .htaccess 檔案。 |
| 4 | App.base 應用程式所在的基目錄。如果為 false,則將自動檢測。 |
| 5 | App.encoding 定義您的應用程式使用的編碼。此編碼用於在佈局中生成字元集,並編碼實體。它應與為資料庫指定的編碼值匹配。 |
| 6 | App.webroot webroot 目錄。 |
| 7 | App.wwwRoot webroot 的檔案路徑。 |
| 8 | App.fullBaseUrl 應用程式根目錄的完全限定域名(包括協議)。 |
| 9 | App.imageBaseUrl webroot 下公共影像目錄的 Web 路徑。 |
| 10 | App.cssBaseUrl webroot 下公共 css 目錄的 Web 路徑。 |
| 11 | App.jsBaseUrl webroot 下公共 js 目錄的 Web 路徑。 |
| 12 | App.paths 配置非基於類的資源的路徑。支援外掛、模板、語言環境、子鍵,分別允許定義外掛、檢視模板和語言環境檔案的路徑。 |
| 13 | Security.salt 用於雜湊的隨機字串。此值還在進行對稱加密時用作 HMAC 鹽。 |
| 14 | Asset.timestamp 在使用適當的助手時,將時間戳(特定檔案的最後修改時間)附加到資產檔案 URL(CSS、JavaScript、影像)的末尾。有效值為:
|
資料庫配置
資料庫可以在 **config/app.php 和 config/app_local.php** 檔案中配置。此檔案包含一個具有預設引數的預設連線,可以根據需要修改。
以下程式碼片段顯示了預設引數和值,應根據需求進行修改。
Config/app_local.php
*/
'Datasources' => [
'default' => [
'host' => 'localhost',
'username' => 'my_app',
'password' => 'secret',
'database' => 'my_app',
'url' => env('DATABASE_URL', null),
],
/*
* The test connection is used during the test suite.
*/
'test' => [
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'secret',
'database' => 'test_myapp',
//'schema' => 'myapp',
],
],
讓我們詳細瞭解 **config/app_local.php** 中的每個引數。
| 主機 | 資料庫伺服器的主機名(或 IP 地址)。 |
|---|---|
| 使用者名稱 | 資料庫使用者名稱 |
| 密碼 | 資料庫密碼。 |
| 資料庫 | 資料庫名稱。 |
| 埠 | 用於連線伺服器的 TCP 埠或 Unix 套接字。 |
config/app.php
'Datasources' => [
'default' => [
'className' => Connection::class,
'driver' => Mysql::class,
'persistent' => false,
'timezone' => 'UTC',
//'encoding' => 'utf8mb4',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
],
]
讓我們詳細瞭解 **config/app.php** 中的每個引數。
| 序號 | 鍵值 & 描述 |
|---|---|
| 1 | 類名 表示與資料庫伺服器連線的類的完全名稱空間類名。此類負責載入資料庫驅動程式,提供 SQL 事務機制和準備 SQL 語句等。 |
| 2 | 驅動程式 用於實現資料庫引擎所有特性的驅動程式類名。這可以是使用外掛語法的簡短類名、完全名稱空間名稱或構造的驅動程式例項。簡短類名的示例包括 Mysql、Sqlite、Postgres 和 Sqlserver。 |
| 3 | 持久連線 是否使用與資料庫的持久連線。 |
| 4 | 編碼 指示在向伺服器傳送 SQL 語句時使用的字元集,例如“utf8”等。 |
| 5 | 時區 要設定的伺服器時區。 |
| 6 | 初始化 建立連線時應傳送到資料庫伺服器的查詢列表。 |
| 7 | 日誌 設定為 true 以啟用查詢日誌記錄。啟用後,查詢將在除錯級別使用 queriesLog 範圍記錄。 |
| 8 | 引用識別符號 如果在表名或列名中使用保留字或特殊字元,則設定為 true。啟用此設定將導致使用查詢生成器構建的查詢在建立 SQL 時引用識別符號。它會降低效能。 |
| 9 | 標誌 應傳遞給底層 PDO 例項的 PDO 常量的關聯陣列。 |
| 10 | 快取元資料 布林值 true 或包含用於儲存元資料的快取配置的字串。不建議停用元資料快取,這可能會導致效能非常差。 |
電子郵件配置
可以在 **config/app.php** 檔案中配置電子郵件。無需在 config/app.php 中定義電子郵件配置。無需配置即可使用電子郵件。只需使用相應的方法分別設定所有配置或載入配置陣列即可。電子郵件預設配置使用 **config()** 和 **configTransport()** 建立。
電子郵件配置傳輸
透過將傳輸與投遞配置檔案分開定義,可以輕鬆地在多個配置檔案中重用傳輸配置。可以為生產、開發和測試指定多個配置。每個傳輸都需要一個 className。有效選項如下:
**Mail** - 使用 PHP mail 函式傳送
**Smtp** - 使用 SMTP 傳送
**Debug** - 不傳送電子郵件,只返回結果
可以透過將相應的檔案新增到 **src/Mailer/Transport** 來新增自定義傳輸(或覆蓋現有傳輸)。傳輸應命名為 **YourTransport.php**,其中“**Your**”是傳輸的名稱。
以下是電子郵件配置傳輸的示例。
'EmailTransport' => [
'default' => [
'className' => 'Mail',
// The following keys are used in SMTP transports
'host' => 'localhost',
'port' => 25,
'timeout' => 30,
'username' => 'user',
'password' => 'secret',
'client' => null,
'tls' => null,
'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
],
],
電子郵件投遞配置檔案
投遞配置檔案允許預定義有關應用程式中電子郵件訊息的各種屬性,併為設定命名。這節省了應用程式中的重複工作,並簡化了維護和開發。每個配置檔案都接受多個鍵。
以下是一個電子郵件投遞配置檔案的示例。
'Email' => [
'default' => [
'transport' => 'default',
'from' => 'you@localhost',
],
],
CakePHP - 路由
在本章中,我們將學習以下與路由相關的主題:
- 路由介紹
- 連線路由
- 向路由傳遞引數
- 生成 URL
- 重定向 URL
路由介紹
在本節中,我們將瞭解如何實現路由,如何將引數從 URL 傳遞到控制器的操作,如何生成 URL,以及如何重定向到特定 URL。通常,路由在 **config/routes.php** 檔案中實現。路由可以透過兩種方式實現:
- 靜態方法
- 作用域路由構建器
這是一個展示兩種型別的示例。
// Using the scoped route builder.
Router::scope('/', function ($routes) {
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});
// Using the static method.
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);
這兩種方法都將執行 **ArticlesController** 的 index 方法。在這兩種方法中,**作用域路由構建器** 的效能更好。
連線路由
**Router::connect()** 方法用於連線路由。以下是該方法的語法:
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
**Router::connect()** 方法有三個引數:
第一個引數是您希望匹配的 URL 模板。
第二個引數包含路由元素的預設值。
第三個引數包含路由選項,通常包含正則表示式規則。
這是一個路由的基本格式:
$routes->connect( 'URL template', ['default' => 'defaultValue'], ['option' => 'matchingRegex'] );
示例
按照以下所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('/', ['controller' => 'Tests', 'action' => 'show']);
$builder->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
$builder->fallbacks();
});
在 **src/Controller/TestsController.php** 建立一個 **TestsController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/Controller/TestsController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class TestsController extends AppController {
public function show()
{
}
}
在 **src/Template** 下建立一個名為 **Tests** 的資料夾,並在該資料夾下建立一個名為 show.php 的 **檢視檔案**。將以下程式碼複製到該檔案中。
src/Template/Tests/show.php
<h1>This is CakePHP tutorial and this is an example of connecting routes.</h1>
透過訪問以下 URL(位於 https:///cakephp4/)來執行上述示例。
輸出
上述 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 將產生以下輸出。
生成 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 將產生以下輸出:
重定向路由
當我們想要通知客戶端應用程式此 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 的輸出
**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
輸出
執行後,您將收到以下輸出。
現在,訪問以下 URL:https:///cakephp4/redirect-controller2
上述 URL 將提供以下輸出。
載入模型
在 CakePHP 中,可以使用 **loadModel()** 方法載入模型。以下是 **loadModel()** 方法的語法:
Cake\Controller\Controller::loadModel(string $modelClass, string $type)
該函式有兩個引數,如下所示:
第一個引數是模型類的名稱。
第二個引數是要載入的儲存庫型別。
示例
如果要在控制器中載入 Articles 模型,可以在控制器的 action 中寫入以下程式碼:
$this->loadModel('Articles');
CakePHP - 檢視
MVC 中的字母“V”代表檢視(Views)。檢視負責根據請求向用戶傳送輸出。**檢視類**是加速開發過程的一種有效方法。
檢視模板
CakePHP 的檢視模板檔案從控制器獲取資料,然後呈現輸出,以便將其正確顯示給使用者。我們可以在模板中使用變數和各種控制結構。
模板檔案儲存在 **src/Template/** 目錄下,位於使用這些檔案的控制器的同名目錄中,並以其對應的 action 命名。例如,Products 控制器“view()” action 的**檢視**檔案通常位於 src/Template/Products/view.php。
簡而言之,控制器的名稱 (ProductsController) 與資料夾的名稱 (Products) 相同,只是去掉了 Controller 字樣;控制器的 action/方法名稱 (view()) 與檢視檔名稱 (view.php) 相同。
檢視變數
檢視變數是從控制器獲取值的變數。我們可以在檢視模板中使用任意數量的變數。我們可以使用 **set()** 方法將值傳遞給檢視中的變數。這些設定的變數在檢視和 action 呈現的佈局中都可用。以下是 **set()** 方法的語法:
Cake\View\View::set(string $var, mixed $value)
此方法有兩個引數:**變數的名稱**和**其值**。
示例
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
// Register scoped middleware for in scopes.
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('template',['controller'=>'Products','action'=>'view']);
$builder->fallbacks();
});
在 **src/Controller/ProductsController.php** 建立一個 **ProductsController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/Controller/ProductsController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use Cake\Core\Configure;
use Cake\Http\Exception\ForbiddenException;
use Cake\Http\Exception\NotFoundException;
use Cake\Http\Response;
use Cake\View\Exception\MissingTemplateException;
class ProductsController extends AppController {
public function view(){
$this->set('Product_Name','XYZ');
}
}
在 **src/Template** 目錄下建立一個名為 Products 的目錄,並在該目錄下建立一個名為 view.php 的**檢視**檔案。將以下程式碼複製到該檔案中。
Value of variable is: <?php echo $Product_Name; ? >
透過訪問以下 URL 來執行上述示例。
https:///cakephp4/template
輸出
上述 URL 將產生以下輸出。
CakePHP - 擴充套件檢視
在製作網頁時,我們常常需要在其他頁面中重複某些頁面部分。CakePHP 提供了這樣的功能,允許在一個檢視中擴充套件另一個檢視,而無需重複程式碼。
**extend()** 方法用於在**檢視**檔案中擴充套件檢視。此方法接受一個引數,即帶有路徑的檢視檔案的名稱。在提供檢視檔案的名稱時,不要使用副檔名 .ctp。
示例
按以下程式所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('extend',['controller'=>'Extends','action'=>'index']);
$builder->fallbacks();
});
在 **src/Controller/ExtendsController.php** 建立一個 **ExtendsController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/Controller/ExtendsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class ExtendsController extends AppController{
public function index(){
}
}
?>
在 **src/Template** 目錄下建立一個名為 **Extends** 的目錄,並在該目錄下建立一個名為 header.php 的**檢視**檔案。將以下程式碼複製到該檔案中。
src/Template/Extends/header.php
<div align="center">
<h1>Common Header</h1>
</div>
<?= $this->fetch('content') ?>
在 **Extends** 目錄下建立另一個名為 **index.php** 的**檢視**檔案。將以下程式碼複製到該檔案中。在這裡,我們正在擴充套件上面的檢視 **header.php**。
src/Template/Extends/index.php
<?php $this->extend('header'); ?>
This is an example of extending view.
訪問以下 URL https:///cakephp4/extend 執行上述示例。
輸出
執行後,您將收到以下輸出。
CakePHP - 檢視元素
網頁的某些部分在多個網頁上重複出現,但在不同的位置。CakePHP 可以幫助我們重用這些重複的部分。這些可重用的部分稱為**元素 - 幫助框、額外選單**等。元素基本上是一個**迷你檢視**。我們也可以在元素中傳遞變數。
Cake\View\View::element(string $elementPath, array $data, array $options =[]
上述函式有三個引數,如下所示:
第一個引數是 **src/Template/element/** 資料夾中模板檔案的名稱。
第二個引數是要提供給呈現檢視的資料陣列。
第三個引數用於選項陣列,例如快取。
在三個引數中,第一個是必需的,其餘是可選的。
示例
在 **src/Template/element** 目錄下建立一個名為 **helloworld.php** 的元素檔案。將以下程式碼複製到該檔案中。
src/Template/element/helloworld.php
<p>Hello World</p>
在 **src/Template** 目錄下建立一個名為 **Elems** 的資料夾,並在該目錄下建立一個名為 index.php 的**檢視**檔案。將以下程式碼複製到該檔案中。
src/Template/Elems/index.php
Element Example: <?php echo $this->element('helloworld'); ?>
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
$builder->connect('/element-example',['controller'=>'Elems','action'=>'index']);
$builder->fallbacks();
});
在 **src/Controller/ElemsController.php** 建立一個 **ElemsController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/Controller/ElemsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class ElemsController extends AppController{
public function index(){
}
}
?>
訪問以下 URL https:///cakephp4/element-example 執行上述示例。
輸出
執行後,上述 URL 將給出以下輸出。
CakePHP - 檢視事件
我們可以使用檢視事件使用多個回撥/事件。這些事件有助於在某些事情發生之前或之後執行多項任務。以下是可用於 CakePHP 的回撥列表:
| 序號 | 事件函式和說明 |
|---|---|
| 1 | Helper::beforeRender(Event $event,$viewFile) **beforeRender** 方法在控制器的 beforeRender 方法之後但控制器呈現**檢視**和**佈局**之前呼叫。這將接收正在呈現的檔案作為引數。 |
| 2 | Helper::beforeRenderFile(Event $event, $viewFile) 此方法在呈現每個檢視檔案之前呼叫。這包括**元素、檢視、父檢視**和**佈局**。 |
| 3 | Helper::afterRenderFile(Event $event, $viewFile, $content) 此方法在呈現每個檢視檔案之後呼叫。這包括**元素、檢視、父檢視**和**佈局**。回撥可以修改並返回**$content** 以更改呈現的內容如何在瀏覽器中顯示。 |
| 4 | Helper::afterRender(Event $event, $viewFile) 此方法在檢視呈現後但佈局呈現開始之前呼叫。 |
| 5 | Helper::beforeLayout(Event $event, $layoutFile) 此方法在佈局呈現開始之前呼叫。這將接收佈局檔名作為引數。 |
| 6 | Helper::afterLayout(Event $event, $layoutFile) 此方法在佈局呈現完成後呼叫。這將接收佈局檔名作為引數。 |
CakePHP - 資料庫操作
在 CakePHP 中使用資料庫非常容易。我們將在本章中瞭解 CRUD(建立、讀取、更新、刪除)操作。
此外,我們還需要在 **config/app_local.php 檔案**中配置我們的資料庫。
'Datasources' => [
'default' => [
'host' => 'localhost',
'username' => 'my_app',
'password' => 'secret',
'database' => 'my_app',
'url' => env('DATABASE_URL', null),
],
/*
* The test connection is used during the test suite.
*/
'test' => [
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'my_app',
'password' => 'secret',
'database' => 'test_myapp',
//'schema' => 'myapp',
],
],
預設連線具有以下詳細資訊:
'host' => 'localhost', 'username' => 'my_app', 'password' => 'secret', 'database' => 'my_app',
您可以根據自己的選擇更改詳細資訊,即主機、使用者名稱、密碼和資料庫。
完成後,請確保它已在 config/app_local.php 的 Datasources 物件中更新。
現在,我們將繼續使用上述詳細資訊,轉到您的 phpmyadmin 或 mysql 資料庫,並建立名為 my_app 的使用者,如下所示:
授予必要的許可權並儲存。現在,我們根據 app_local.php 中提到的配置擁有資料庫詳細資訊。當您檢查 CakePHP 首頁時,您應該會看到以下內容:
現在,我們將在資料庫中建立以下 users 表。
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
插入記錄
要在資料庫中插入記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。
此新例項用於建立新實體。使用新實體的例項設定必要的值。我們現在必須使用 **TableRegistry** 類的例項呼叫 **save()** 方法,這將向資料庫插入新記錄。
示例
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/users/add', ['controller' => 'Users', 'action' => 'add']);
$builder->fallbacks();
});
在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/controller/UsersController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\Auth\DefaultPasswordHasher;
class UsersController extends AppController{
public function add(){
if($this->request->is('post')){
$username = $this->request->getData('username');
$hashPswdObj = new DefaultPasswordHasher;
$password = $hashPswdObj->hash($this->request->getData('password'));
$users_table = TableRegistry::get('users');
$users = $users_table->newEntity($this->request->getData());
$users->username = $username;
$users->password = $password;
$this->set('users', $users);
if($users_table->save($users))
echo "User is added.";
}
}
}
?>
在 **src/Template** 目錄下建立一個名為 **Users** 的目錄,並在該目錄下建立一個名為 add.php 的**檢視**檔案。將以下程式碼複製到該檔案中。
src/Template/Users/add.php
<?php
echo $this->Form->create(NULL,array('url'=>'/users/add'));
echo $this->Form->control('username');
echo $this->Form->control('password');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
訪問以下 URL https:///cakephp4/users/add 執行上述示例。
輸出
執行後,您將收到以下輸出。
資料將儲存到 users 表中,如下所示:
CakePHP - 檢視記錄
要檢視資料庫記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。
現在,此新例項用於使用 find() 方法從資料庫查詢記錄。此方法將返回請求表中的所有記錄。
示例
按以下程式碼所示更改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/users', ['controller' => 'Users', 'action' => 'index']);
$builder->fallbacks();
});
在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/controller/UsersController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
class UsersController extends AppController{
public function index(){
$users = TableRegistry::get('users');
$query = $users->find();
$this->set('results',$query);
}
}
?>
在 **src/Template** 目錄下建立一個名為 **Users** 的目錄(如果已建立則忽略),並在該目錄下建立一個名為 **index.php** 的**檢視**檔案。將以下程式碼複製到該檔案中。
src/Template/Users/index.ctp
<a href="add">Add User</a>
<table>
<tr>
<td>ID</td>
<td>Username</td>
<td>Password</td>
<td>Edit</td>
<td>Delete</td>
</tr>
<?php
foreach ($results as $row):
echo "<tr><td>".$row->id."</td>";
echo "<td<".$row-<username."</td>";
echo "<td>".$row->password."</td>";
echo "<td><a href='".$this-<Url->build(["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";
echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "delete",$row->id])."'>Delete</a></td></tr>";
endforeach;
?>
</table>
訪問以下 URL https:///cakephp4/users 執行上述示例。
輸出
執行後,上述 URL 將給出以下輸出。
CakePHP - 更新記錄
要在資料庫中更新記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。**get()** 方法將資料庫表的名稱作為引數。現在,此新例項用於獲取我們要更新的特定記錄。
使用此新例項呼叫 **get()** 方法,並傳遞主鍵以查詢將儲存到另一個例項中的記錄。使用此例項設定要更新的新值,然後最終使用 **TableRegistry** 類的例項呼叫 **save()** 方法以更新記錄。
示例
按以下程式碼所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/users/edit', ['controller' => 'Users', 'action' => 'edit']);
$builder->fallbacks();
});
在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/controller/UsersController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
class UsersController extends AppController{
public function index(){
$users = TableRegistry::get('users');
$query = $users->find();
$this->set('results',$query);
}
public function edit($id){
if($this->request->is('post')){
$username = $this->request->getData('username');
$password = $this->request->getData('password');
$users_table = TableRegistry::get('users');
$users = $users_table->get($id);
$users->username = $username;
$users->password = $password;
if($users_table->save($users))
echo "User is udpated";
$this->setAction('index');
} else {
$users_table = TableRegistry::get('users')->find();
$users = $users_table->where(['id'=>$id])->first();
$this->set('username',$users->username);
$this->set('password',$users->password);
$this->set('id',$id);
}
}
}
?>
在 **src/Template** 目錄下建立一個名為 **Users** 的目錄(如果已建立則忽略),並在該目錄下建立一個名為 **index.php** 的檢視。將以下程式碼複製到該檔案中。
src/Template/Users/index.php
<a href="add">Add User</a>
<table>
<tr>
<td>ID</td>
<td>Username</td>
<td>Password</td>
<td>Edit</td>
<td>Delete</td>
</tr>
<?php
foreach ($results as $row):
echo "<tr><td>".$row->id."</td>";
echo "<td>".$row->username."</td>";
echo "<td>".$row->password."</td>";
echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";
echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "delete",$row->id])."'>Delete</a></td></tr>";
endforeach;
?>
</table>
在 Users 目錄下建立另一個名為 **edit.php** 的**檢視**檔案,並將以下程式碼複製到其中。
src/Template/Users/edit.php
<?php
echo $this->Form->create(NULL,array('url'=>'/users/edit/'.$id));
echo $this->Form->control('username',['value'=>$username]);
echo $this->Form->control('password',['value'=>$password]);
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
訪問以下 URL 並單擊**編輯連結**以編輯記錄來執行上述示例。
https:///cakephp4/users
輸出
訪問上述 URL 後,它將顯示 users 表中的記錄,如下所示:
單擊“編輯”按鈕,將顯示以下螢幕:
現在,我們將名稱 Virat 更新為 Virat123 並提交詳細資訊。顯示的下一個螢幕如下所示:
CakePHP - 刪除記錄
要在資料庫中刪除記錄,我們首先需要使用 **TableRegistry** 類獲取表。我們可以使用 **get()** 方法從登錄檔中獲取例項。get() 方法將資料庫表的名稱作為引數。現在,此新例項用於獲取我們要刪除的特定記錄。
使用此新例項呼叫get()方法,並傳遞主鍵來查詢記錄,該記錄將儲存到另一個例項中。使用 TableRegistry 類的例項呼叫delete方法從資料庫中刪除記錄。
示例
按以下程式碼所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/users/delete', ['controller' => 'Users', 'action' => 'delete']);
$builder->fallbacks();
});
在 **src/Controller/UsersController.php** 建立一個 **UsersController.php** 檔案。將以下程式碼複製到控制器檔案中。
src/controller/UsersController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
class UsersController extends AppController{
public function index(){
$users = TableRegistry::get('users');
$query = $users->find();
$this->set('results',$query);
}
public function delete($id){
$users_table = TableRegistry::get('users');
$users = $users_table->get($id);
$users_table->delete($users);
echo "User deleted successfully.";
$this->setAction('index');
}
}
?>
只需在Users目錄下建立一個名為delete.ctp的空View檔案。
src/Template/Users/delete.ctp
在src/Template目錄下建立Users目錄(如果已建立則忽略),然後在該目錄下建立一個名為index.ctp的View檔案。將以下程式碼複製到該檔案中。
src/Template/Users/index.ctp
<a href="add">Add User</a>
<table>
<tr>
<td>ID</td>
<td>Username</td>
<td>Password</td>
<td>Edit</td>
<td>Delete</td>
</tr>
<?php
foreach ($results as $row):
echo "<tr><td>".$row->id."</td>";
echo "<td>".$row->username."</td>";
echo "<td>".$row->password."</td>";
echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";
echo "<td><a href='".$this->Url->build(["controller" => "Users","action" => "delete",$row->id])."'>Delete</a></td></tr>";
endforeach;
?>
</table>
訪問以下URL並單擊刪除連結來刪除記錄,以執行上述示例。
https://:85/CakePHP/users
輸出
訪問上述URL並單擊刪除連結後,您將收到以下輸出,您可以在其中刪除記錄。
單擊刪除連結以刪除記錄。
CakePHP - 服務
本章介紹CakePHP中提供的身份驗證過程資訊。
身份驗證
身份驗證是識別正確使用者的過程。CakePHP支援三種身份驗證型別。
FormAuthenticate − 它允許您基於表單 POST 資料對使用者進行身份驗證。通常,這是一個使用者輸入資訊的登入表單。這是預設的身份驗證方法。
BasicAuthenticate − 它允許您使用基本 HTTP 身份驗證對使用者進行身份驗證。
DigestAuthenticate − 它允許您使用摘要 HTTP 身份驗證對使用者進行身份驗證。
FormAuthentication 示例
按以下程式碼所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
Router::defaultRouteClass('DashedRoute');
Router::scope('/', function (RouteBuilder $routes) {
$routes->connect('/auth',['controller'=>'Authexs','action'=>'index']);
$routes->connect('/login',['controller'=>'Authexs','action'=>'login']);
$routes->connect('/logout',['controller'=>'Authexs','action'=>'logout']);
$routes->fallbacks('DashedRoute');
});
Plugin::routes();
更改AppController.php檔案的程式碼,如下面的程式所示。
src/Controller/AppController.php
<?php
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;
use Cake\Controller\Component\AuthComponent;
class AppController extends Controller {
public function initialize() {
parent::initialize();
$this->loadComponent('RequestHandler');
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'username',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Authexs',
'action' => 'login'
],
'loginRedirect' => [
'controller' => 'Authexs',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Authexs',
'action' => 'login'
]
]);
}
public function beforeFilter(Event $event) {
$this->Auth->allow(['index','view']);
$this->set('loggedIn', $this->Auth->user());
}
}
在src/Controller/AuthexsController.php處建立AuthexsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/AuthexsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\Datasource\ConnectionManager;
use Cake\Event\Event;
use Cake\Auth\DefaultPasswordHasher;
class AuthexsController extends AppController {
var $components = array('Auth');
public function index(){
}
public function login(){
if($this->request->is('post')) {
$user = $this->Auth->identify();
if($user){
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
} else
$this->Flash->error('Your username or password is incorrect.');
}
}
public function logout(){
return $this->redirect($this->Auth->logout());
}
}
?>
在src/Template目錄下建立Authexs目錄,然後在該目錄下建立一個名為login.php的View檔案。將以下程式碼複製到該檔案中。
src/Template/Authexs/login.php
<?php
echo $this->Form->create();
echo $this->Form->control('username');
echo $this->Form->control('password');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
建立另一個名為logout.php的View檔案。將以下程式碼複製到該檔案中。
src/Template/Authexs/logout.php
You are successfully logged out.
建立另一個名為index.php的View檔案。將以下程式碼複製到該檔案中。
src/Template/Authexs/index.php
You are successfully logged in.
<?php
echo $this->Html->link('logout',[
"controller" => "Authexs","action" => "logout"
]);
?>
透過訪問以下 URL 來執行上述示例。
https:///cakephp4/auth
輸出
由於已實現身份驗證,因此當您嘗試訪問上述URL時,您將被重定向到如下所示的登入頁面。
提供正確的憑據後,您將登入並重定向到如下所示的螢幕。
單擊登出連結後,您將再次被重定向到登入螢幕。
CakePHP - 錯誤和異常處理
為了系統的順利執行,需要有效地處理系統的故障。CakePHP帶有預設的錯誤陷阱,它會在錯誤發生時列印和記錄錯誤。相同的錯誤處理程式用於捕獲異常。
當debug為true時,錯誤處理程式顯示錯誤,當debug為false時,錯誤處理程式記錄錯誤。CakePHP有很多異常類,內建的異常處理將捕獲任何未捕獲的異常並呈現有用的頁面。
錯誤和異常配置
錯誤和異常可以在config\app.php檔案中配置。錯誤處理接受一些選項,允許您為您的應用程式定製錯誤處理 -
| 選項 | 資料型別 | 描述 |
|---|---|---|
| errorLevel | int | 您感興趣的捕獲錯誤的級別。使用內建的php錯誤常量和位掩碼來選擇您感興趣的錯誤級別。 |
| trace | bool | 在日誌檔案中包含錯誤的堆疊跟蹤。堆疊跟蹤將在每個錯誤後包含在日誌中。這有助於查詢錯誤的發生位置/時間。 |
| exceptionRenderer | string | 負責呈現未捕獲異常的類。如果您選擇一個自定義類,則應將該類的檔案放在src/Error中。此類需要實現一個render()方法。 |
| 日誌 | bool | 如果為true,異常及其堆疊跟蹤將記錄到Cake\Log\Log。 |
| skipLog | array | 不應該記錄的異常類名的陣列。這對於刪除NotFoundExceptions或其他常見但無趣的日誌訊息很有用。 |
| extraFatalErrorMemory | int | 遇到致命錯誤時,設定為增加記憶體限制的兆位元組數。這允許有足夠的餘地來完成日誌記錄或錯誤處理。 |
示例
按以下程式碼所示更改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/exception/:arg1/:arg2',
['controller'=>'Exps','action'=>'index'],
['pass' => ['arg1', 'arg2']]);
$builder->fallbacks();
});
在src/Controller/ExpsController.php處建立ExpsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/ExpsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Core\Exception\Exception;
class ExpsController extends AppController {
public function index($arg1,$arg2) {
try{
$this->set('argument1',$arg1);
$this->set('argument2',$arg2);
if(($arg1 > 1 || $arg1 > 10) || ($arg2 < 1 || $arg2 > 10))
throw new Exception("One of the number is out of range [1-10].");
} catch(\Exception $ex){
echo $ex->getMessage();
}
}
}
?>
在src/Template目錄下建立Exps目錄,然後在該目錄下建立一個名為index.php的View檔案。將以下程式碼複製到該檔案中。
src/Template/Exps/index.php
This is CakePHP tutorial and this is an example of Passed arguments.
Argument-1: <?=$argument1?><br/> Argument-2: <?=$argument2?><br/>
透過訪問以下 URL 來執行上述示例。
https:///cakephp4/exception/5/0
輸出
執行後,您將收到以下輸出。
CakePHP - 日誌記錄
在CakePHP中進行日誌記錄是一項非常簡單的任務。您只需要使用一個函式。您可以記錄錯誤、異常、使用者活動、使用者採取的操作以及任何後臺程序(如cronjob)。在CakePHP中記錄資料很容易。log()函式由LogTrait提供,LogTrait幾乎是所有CakePHP類的共同祖先。
日誌記錄配置
我們可以在config/app.php檔案中配置日誌。該檔案中有一個日誌部分,您可以在其中配置日誌記錄選項,如下面的螢幕截圖所示。
預設情況下,您將看到已經為您配置的兩個日誌級別 - error 和 debug。每個級別都將處理不同級別的訊息。
CakePHP支援各種日誌記錄級別,如下所示:
Emergency − 系統無法使用
Alert − 必須立即採取行動
Critical − 嚴重情況
Error − 錯誤情況
Warning − 警告情況
Notice − 正常但重要的條件
Info − 資訊訊息
Debug − 除錯級別訊息
寫入日誌檔案
我們可以透過兩種方式向日志文件寫入內容。
第一種是使用靜態write()方法。以下是靜態write()方法的語法。
| 語法 | write( integer|string $level, mixed $message, string|array $context [] ) |
|---|---|
| 引數 |
正在寫入的訊息的嚴重級別。該值必須是整數或與已知級別匹配的字串。 要記錄的訊息內容。 用於記錄訊息的其他資料。可以傳遞特殊的範圍鍵以用於進一步過濾要使用的日誌引擎。如果傳遞字串或數字索引陣列,則將被視為範圍鍵。有關日誌範圍的更多資訊,請參見Cake\Log\Log::config()。 |
| 返回值 | boolean |
| 描述 | 將給定的訊息和型別寫入所有已配置的日誌介面卡。已配置的介面卡同時傳遞$level和$message變數。$level是以下字串/值之一。 |
第二種是使用任何使用LogTrait的log()快捷方式函式。呼叫log()將在內部呼叫Log::write() -
示例
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',
['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('logex',['controller'=>'Logexs','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/LogexsController.php處建立LogexsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/LogexsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Log\Log;
class LogexsController extends AppController{
public function index(){
/*The first way to write to log file.*/
Log::write('debug',"Something didn't work.");
/*The second way to write to log file.*/
$this->log("Something didn't work.",'debug');
}
}
?>
在src/Template目錄下建立Logexs目錄,然後在該目錄下建立一個名為index.php的View檔案。將以下程式碼複製到該檔案中。
src/Template/Logexs/index.php
Something is written in log file. Check log file logs\debug.log
透過訪問以下 URL 來執行上述示例。
https:///cakephp4/logex
輸出
執行後,您將收到以下輸出。
日誌將新增到log/debug.log檔案中 -
CakePHP - 表單處理
CakePHP提供各種內建標籤來輕鬆安全地處理HTML表單。與許多其他PHP框架一樣,HTML的主要元素也是使用CakePHP生成的。以下是用於生成HTML元素的各種函式。
以下函式用於生成選擇選項 -
| 語法 | _selectOptions( array $elementsarray(), array $parentsarray(), boolean $showParentsnull, array $attributesarray() ) |
|---|---|
| 引數 |
|
| 返回值 | array |
| 描述 | 返回格式化的OPTION/OPTGROUP元素陣列 |
以下函式用於生成HTML select元素。
| 語法 | select( string $fieldName, array $options array(), array $attributes array() ) |
|---|---|
| 引數 | SELECT 的 name 屬性 要在SELECT元素中使用的OPTION元素陣列(作為'value'=>'Text'對)。 |
| 返回值 | 格式化的SELECT元素。 |
| 描述 | 返回格式化的SELECT元素。 |
以下函式用於在HTML頁面上生成按鈕。
| 語法 | Button(string $title, array $optionsarray() ) |
|---|---|
| 引數 |
|
| 返回值 | HTML按鈕標籤。 |
| 描述 | 建立一個<button>標籤。type屬性預設為type="submit"。您可以使用$options['type']將其更改為不同的值。 |
以下函式用於在HTML頁面上生成複選框。
| 語法 | Checkbox(string $fieldName, array $optionsarray() ) |
|---|---|
| 引數 |
|
| 返回值 | HTML文字輸入元素。 |
| 描述 | 建立一個複選框輸入控制元件。 |
以下函式用於在HTML頁面上建立表單。
| 語法 | create( mixed $modelnull , array $optionsarray() ) |
|---|---|
| 引數 |
|
| 返回值 | 格式化的FORM起始標籤。 |
| 描述 | 返回HTML FORM元素。 |
以下函式用於在HTML頁面上提供檔案上傳功能。
| 語法 | file(string $fieldName, array $optionsarray() ) |
|---|---|
| 引數 |
|
| 返回值 | 生成的file輸入。 |
| 描述 | 建立檔案輸入控制元件。 |
以下函式用於在HTML頁面上建立隱藏元素。
| 語法 | hidden( string $fieldName , array $optionsarray() ) |
|---|---|
| 引數 |
|
| 返回值 | 生成的隱藏輸入 |
| 描述 | 建立一個隱藏輸入欄位 |
以下函式用於在HTML頁面上生成輸入元素。
| 語法 | Input(string $fieldName , array $options array() ) |
|---|---|
| 引數 |
|
| 返回值 | 完整的表單控制元件 |
| 描述 | 生成一個包含標籤和包裝div的表單輸入元素 |
以下函式用於在HTML頁面上生成單選按鈕。
| 語法 | Radio(string $fieldName , array $optionsarray() , array $attributesarray() ) |
|---|---|
| 引數 |
|
| 返回值 | 完整的單選控制元件集 |
| 描述 | 建立一組單選控制元件。預設情況下將建立圖例和欄位集。使用$options控制此操作。 |
以下函式用於在HTML頁面上生成提交按鈕。
| 語法 | Submit(string $caption null, array $options array() ) |
|---|---|
| 引數 |
|
| 返回值 | HTML提交按鈕 |
| 描述 | 建立一個提交按鈕元素。此方法將生成<input />元素,可以使用$options提交和重置表單。可以透過為$caption提供影像路徑來建立影像提交。 |
以下函式用於在HTML頁面上生成textarea元素。
| 語法 | Textarea(string $fieldName , array $options array() ) |
|---|---|
| 引數 |
|
| 返回值 | 生成的HTML文字輸入元素 |
| 描述 | 建立文字區域小部件 |
示例
按以下程式碼所示更改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('register',['controller'=>'Registrations','action'=>'index']);
$builder->fallbacks();
});
在以下位置建立一個**RegistrationsController.php**檔案:
**src/Controller/RegistrationsController.php。** 將以下程式碼複製到控制器檔案中。
src/Controller/RegistrationsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class RegistrationsController extends AppController{
public function index(){
$country = array('India','United State of America','United Kingdom');
$this->set('country',$country);
$gender = array('Male','Female');
$this->set('gender',$gender);
}
}
?>
在**src/Template**目錄下建立一個**Registrations**目錄,並在該目錄下建立一個名為**index.php**的**View**檔案。將以下程式碼複製到該檔案中。
src/Template/Registrations/index.php
<?php
echo $this->Form->create(NULL,array('url'=>'/register'));
echo '<label for="country">Country</label>';
echo $this->Form->select('country',$country);
echo '<label for="gender">Gender</label>';
echo $this->Form->radio('gender ',$gender);
echo '<label for="address">Address</label>';
echo $this->Form->textarea('address');
echo $this->Form->file('profilepic');
echo '<div>'.$this->Form->checkbox('terms').
'<label for="country">Terms ∓ Conditions</label></div>';
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/register
輸出
執行後,您將收到以下輸出。
CakePHP - 國際化
像許多其他框架一樣,CakePHP也支援國際化。我們需要遵循以下步驟才能從單一語言過渡到多種語言。
步驟 1
建立一個單獨的語言環境目錄resources\**locales**。
步驟 2
在src\Locale目錄下為每種語言建立子目錄。子目錄的名稱可以是語言的兩位字母ISO程式碼或完整的語言環境名稱,例如en_US、fr_FR等。
步驟 3
在每個語言子目錄下建立一個單獨的**default.po**檔案。此檔案包含以**msgid**和**msgstr**形式的條目,如下面的程式所示。
msgid "msg" msgstr "CakePHP Internationalization example."
這裡,**msgid**是將在View模板檔案中使用的鍵,**msgstr**是儲存翻譯的值。
步驟 4
在View模板檔案中,我們可以使用上面的**msgid**,如下所示,它將根據語言環境的設定值進行翻譯。
<?php echo __('msg'); ?>
預設語言環境可以透過以下行在**config/app.php**檔案中設定。
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US')
要在執行時更改語言環境,可以使用以下幾行程式碼。
use Cake\I18n\I18n;
I18n::locale('de_DE');
示例
按以下程式所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',
['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('locale',
['controller'=>'Localizations','action'=>'index']);
$builder->fallbacks();
});
在**src/Controller/LocalizationsController.php**位置建立一個**LocalizationsController.php**檔案。將以下程式碼複製到控制器檔案中。
src/Controller/LocalizationsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\I18n\I18n;
class LocalizationsController extends AppController {
public function index() {
if($this->request->is('post')) {
$locale = $this->request->getData('locale');
I18n::setLocale($locale);
}
}
}
?>
在resources\**locales**目錄下建立一個**locales**目錄。在locales目錄下建立3個名為**en_US、fr_FR、de_DE**的目錄。在每個目錄下建立一個名為**default.po**的檔案。將以下程式碼複製到相應的檔案中。
resources/locales/en_US/default.po
msgid "msg" msgstr "CakePHP Internationalization example."
resources/locales/fr_FR/default.po
msgid "msg" msgstr "Exemple CakePHP internationalisation."
resources/locales/de_DE/default.po
msgid "msg" msgstr "CakePHP Internationalisierung Beispiel."
在**src/Template**目錄下建立一個**Localizations**目錄,並在該目錄下建立一個名為**index.php**的**View**檔案。將以下程式碼複製到該檔案中。
src/Template/Localizations/index.php
<?php
echo $this->Form->create(NULL,array('url'=>'/locale'));
echo $this->Form->radio("locale",
[
['value'=>'en_US','text'=>'English'],
['value'=>'de_DE','text'=>'German'],
['value'=>'fr_FR','text'=>'French'],
]
);
echo $this->Form->button('Change Language');
echo $this->Form->end();
?>
<?php echo __('msg'); ?>
透過訪問以下URL來執行上述示例。https:///cakephp4/locale
輸出
執行後,您將收到以下輸出。
電子郵件
CakePHP提供Email類來管理與電子郵件相關的功能。要在任何控制器中使用電子郵件功能,首先需要透過編寫以下行來載入Email類。
use Cake\Mailer\Email;
Email類提供各種有用的方法,如下所述。
| 語法 | From(string|array|null $email null, string|null $name null ) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 它指定將從哪個電子郵件地址傳送電子郵件 |
| 語法 | To(string|array|null $emailnull, string|null $namenull) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 它指定將向誰傳送電子郵件 |
| 語法 | Send(string|array|null $contentnull) |
|---|---|
| 引數 |
|
| 返回值 | array |
| 描述 | 使用指定的內容、模板和佈局傳送電子郵件 |
| 語法 | Subject(string|null $subjectnull) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 獲取/設定主題 |
| 語法 | Attachments(string|array|null $attachmentsnull) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 向電子郵件訊息新增附件 |
| 語法 | Bcc(string|array|null $emailnull, string|null $namenull) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 密件抄送 |
| 語法 | cc( string|array|null $emailnull , string|null $namenull ) |
|---|---|
| 引數 |
|
| 返回值 | array|$this |
| 描述 | 抄送 |
示例
按以下程式所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/email',['controller'=>'Emails','action'=>'index']);
$builder->fallbacks();
});
在**src/Controller/EmailsController.php**位置建立一個**EmailsController.php**檔案。將以下程式碼複製到控制器檔案中。
src/Controller/EmailsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Mailer\Email;
class EmailsController extends AppController{
public function index(){
$email = new Email('default');
$email->to('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
透過訪問以下URL來執行上述示例:https:///cakephp/email
輸出
執行後,您將收到以下輸出。
CakePHP - 會話管理
會話允許我們跨請求管理唯一使用者,併為特定使用者儲存資料。會話資料可以在任何地方訪問,任何您可以訪問請求物件的地方,即會話可以從控制器、檢視、輔助程式、單元和元件訪問。
訪問會話物件
可以透過執行以下程式碼來建立會話物件。
$session = $this->request->session();
寫入會話資料
要向會話中寫入內容,我們可以使用**write()**會話方法。
Session::write($key, $value)
上述方法將採用兩個引數:**值**和**鍵**,值將儲存在該鍵下。
示例
$session->write('name', 'Virat Gandhi');
讀取會話資料
要從會話中檢索儲存的資料,我們可以使用**read()**會話方法。
Session::read($key)
上述函式只接受一個引數,即寫入會話資料時使用的**值的鍵**。一旦提供了正確的鍵,函式將返回其值。
示例
$session->read('name');
當您想檢查特定資料是否存在於會話中時,可以使用**check()**會話方法。
Session::check($key)
上述函式只接受鍵作為引數。
示例
if ($session->check('name')) {
// name exists and is not null.
}
刪除會話資料
要從會話中刪除資料,我們可以使用**delete()**會話方法來刪除資料。
Session::delete($key)
上述函式只接受要從會話中刪除的值的鍵。
示例
$session->delete('name');
當您想讀取然後從會話中刪除資料時,可以使用**consume()**會話方法。
static Session::consume($key)
上述函式只接受鍵作為引數。
示例
$session->consume('name');
銷燬會話
當用戶從站點登出時,我們需要銷燬使用者會話,並且要銷燬會話,可以使用**destroy()**方法。
Session::destroy()
示例
$session->destroy();
銷燬會話將從伺服器中刪除所有會話資料,但不會刪除會話cookie。
更新會話
在您想更新使用者會話的情況下,我們可以使用**renew()**會話方法。
Session::renew()
示例
$session->renew();
完整會話
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('/session-object',['controller'=>'Sessions','action'=>'index']);
$builder->connect('/session-read',['controller'=>'Sessions','action'=>'retrieve_session_data']);
$builder->connect('/session-write',['controller'=>'Sessions','action'=> 'write_session_data']);
$builder->connect('/session-check',['controller'=>'Sessions','action'=>'check_session_data']);
$builder->connect('/session-delete',['controller'=>'Sessions','action'=>'delete_session_data']);
$builder->connect('/session-destroy',['controller'=>'Sessions','action'=>'destroy_session_data']);
$builder->fallbacks();
});
在**src/Controller/SessionsController.php**位置建立一個**SessionsController.php**檔案。將以下程式碼複製到控制器檔案中
src/Controller/SessionsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class SessionsController extends AppController {
public function retrieveSessionData() {
//create session object
$session = $this->request->getSession();
//read data from session
$name = $session->read('name');
$this->set('name',$name);
}
public function writeSessionData(){
//create session object
$session = $this->request->getSession();
//write data in session
$session->write('name','Virat Gandhi');
}
public function checkSessionData(){
//create session object
$session = $this->request->getSession();
//check session data
$name = $session->check('name');
$address = $session->check('address');
$this->set('name',$name);
$this->set('address',$address);
}
public function deleteSessionData(){
//create session object
$session = $this->request->getSession();
//delete session data
$session->delete('name');
}
public function destroySessionData(){
//create session object
$session = $this->request->getSession();
//destroy session
$session->destroy();
}
}
?>
在**src/Template**目錄下建立一個**Sessions**目錄,並在該目錄下建立一個名為**write_session_data.php**的**View**檔案。將以下程式碼複製到該檔案中。
src/Template/Sessions/write_session_data.php
The data has been written in session.
在同一個**Sessions**目錄下建立另一個名為**retrieve_session_data.php**的**View**檔案,並將以下程式碼複製到該檔案中。
src/Template/Sessions/retrieve_session_data.php
Here is the data from session. Name: <?=$name;?>
在同一個Sessions目錄下建立另一個名為**check_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。
src/Template/Sessions/check_session_data.ctp
<?php if($name): ?> name exists in the session. <?php else: ?> name doesn't exist in the database <?php endif;?> <?php if($address): ?> address exists in the session. <?php else: ?> address doesn't exist in the database <?php endif;?>
在同一個Sessions目錄下建立另一個名為**delete_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。
src/Template/Sessions/delete_session_data.ctp
Data deleted from session.
在同一個Sessions目錄下建立另一個名為**destroy_session_data.ctp**的View檔案,並將以下程式碼複製到該檔案中。
src/Template/Sessions/destroy_session_data.ctp
Session Destroyed.
輸出
透過訪問以下URL來執行上述示例。此URL將幫助您向會話中寫入資料。
https:///cakephp4/session-write
訪問以下URL**以讀取會話資料:https:///cakephp4/session-read**
訪問以下URL**以檢查會話資料:https:///cakephp4/session-check**
訪問以下URL**以刪除會話資料:https:///cakephp4/session-delete** 訪問以下URL
訪問以下URL**以銷燬會話資料:https:///cakephp4/session-destroy**
CakePHP - Cookie 管理
使用CakePHP處理Cookie很容易且安全。有一個CookieComponent類用於管理Cookie。該類提供了幾種處理Cookie的方法。
要使用cookie,請將這兩個類新增到您的控制器中:
use Cake\Http\Cookie\Cookie; use Cake\Http\Cookie\CookieCollection;
必須首先建立cookie物件才能註冊cookie。
$cookie = new Cookie(name,value,expiration time,path,domain);
名稱和值是必須的,其他引數是可選的。
寫入Cookie
以下是寫入cookie的語法。
$cookie = new Cookie(name,value,expiration time,path,domain);
建立的cookie必須新增到cookieCollection中,如下所示:
$cookie = new Cookie('name','XYZ');
$cookies = new CookieCollection([$cookie]);
如果cookie collection物件已經建立,則可以新增其餘cookie,如下所示:
$cookies = $cookies->add($cookie);
讀取Cookie
要讀取cookie,請使用cookiecollection的get()方法。
語法
讀取cookie的語法如下:
Cake\Http\Cookie\CookieCollection::get($name)
這將返回cookiecollection介面,要獲取cookie的值,您必須呼叫getValue()方法。
Cake\Http\Cookie\CookieCollection Interface::getValue()
檢查Cookie
cookieCollection的**has()**方法將告訴您cookie是否存在。
Cake\Http\Cookie\CookieCollection::has($name)
示例
echo $isPresent = $this->cookies->has('name');
刪除Cookie
**remove()**方法用於刪除cookie。以下是remove()方法的語法。
Cake\Http\Cookie\CookieCollection::remove($name)
remove()方法將接受一個引數,即要刪除的cookie變數的名稱($name)。
示例 1
$test = $this->cookies->remove('name');
示例 2
按以下程式所示更改 config/routes.php 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('cookie/testcookies',['controller'=>'Cookies','action'=>'testCookies']);
$builder->fallbacks();
});
在**src/Controller/CookiesController.php**位置建立一個**CookiesController.php**檔案。將以下程式碼複製到控制器檔案中。
src/Controller/Cookies/CookiesController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Http\Cookie\Cookie;
use Cake\Http\Cookie\CookieCollection;
class CookiesController extends AppController{
public $cookies;
public function testCookies() {
$cookie = new Cookie('name','XYZ');
$this->cookies = new CookieCollection([$cookie]);
$cookie_val = $this->cookies->get('name');
$this->set('cookie_val',$cookie_val->getValue());
$isPresent = $this->cookies->has('name');
$this->set('isPresent',$isPresent);
$this->set('count', $this->cookies->count());
$test = $this->cookies->remove('name');
$this->set('count_afterdelete', $test->count());
}
}
?>
在**src/Template**目錄下建立一個**Cookies**目錄,並在該目錄下建立一個名為**test_cookies.php**的**View**檔案。將以下程式碼複製到該檔案中。
src/Template/Cookie/test_cookies.php
The value of the cookie is: <?php echo $cookie_val; ?> <br/> <?php if($isPresent): ?> The cookie is present. <?php else: ?> The cookie isn't present. <?php endif; ?> <br/> <?php echo "The count of cookie before delete is :" .$count; ?> <br/> <?php echo "The count of cookie after delete is :" .$count_afterdelete; ?>
輸出
透過訪問以下URL來執行上述示例:https:///cakephp4/cookie/testcookies
CakePHP - 安全性
安全性是構建Web應用程式時另一個重要功能。它向網站使用者保證他們的資料是安全的。CakePHP提供了一些工具來保護您的應用程式。
加密和解密
CakePHP中的安全庫提供了一些方法,我們可以透過這些方法來加密和解密資料。以下是用於同一目的的兩種方法。
static Cake\Utility\Security::encrypt($text, $key, $hmacSalt = null) static Cake\Utility\Security::decrypt($cipher, $key, $hmacSalt = null)
encrypt方法將接受文字和金鑰作為引數來加密資料,返回值將是帶有HMAC校驗和的加密值。
要雜湊資料,可以使用**hash()**方法。以下是hash()方法的語法。
static Cake\Utility\Security::hash($string, $type = NULL, $salt = false)
CSRF
CSRF代表**跨站點請求偽造**。透過啟用CSRF元件,您可以獲得針對攻擊的保護。CSRF是Web應用程式中常見的漏洞。
它允許攻擊者捕獲並重播之前的請求,有時使用其他域上的影像標籤或資源提交資料請求。可以透過簡單地將**CsrfComponent**新增到您的元件陣列中來啟用CSRF,如下所示:
public function initialize(): void {
parent::initialize();
$this->loadComponent('Csrf');
}
CsrfComponent與**FormHelper**無縫整合。每次使用FormHelper建立表單時,它都會插入一個包含CSRF令牌的隱藏欄位。
雖然不推薦這樣做,但您可能希望在某些請求上停用CsrfComponent。您可以透過在**beforeFilter()**方法期間使用控制器的事件排程程式來做到這一點。
public function beforeFilter(Event $event) {
$this->eventManager()->off($this->Csrf);
}
安全元件
安全元件為您的應用程式應用更嚴格的安全策略。它提供用於各種任務的方法,例如:
限制應用程式接受的HTTP方法 – 在執行副作用之前,應始終驗證正在使用的HTTP方法。應檢查HTTP方法或使用Cake\Network\Request::allowMethod()來確保使用了正確的HTTP方法。
表單篡改保護 – 預設情況下,SecurityComponent 可防止使用者以特定方式篡改表單。SecurityComponent 將阻止以下行為:
無法向表單新增未知欄位。
無法從表單中刪除欄位。
無法修改隱藏輸入中的值。
要求使用SSL – 所有操作都需要SSL安全連線。
限制跨控制器通訊 – 我們可以限制哪些控制器可以向此控制器傳送請求。我們還可以限制哪些操作可以向此控制器的操作傳送請求。
示例
按照以下程式所示修改 **config/routes.php** 檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',
['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('login',['controller'=>'Logins','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/LoginsController.php處建立一個LoginsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/LoginsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class LoginsController extends AppController {
public function initialize() : void {
parent::initialize();
$this->loadComponent('Security');
}
public function index(){
}
}
?>
在src/Template處建立一個名為Logins的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Logins/index.php
<?php
echo $this->Form->create(NULL,array('url'=>'/login'));
echo $this->Form->control('username');
echo $this->Form->control('password');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
透過訪問以下URL執行上述示例:https:///cakephp4/login
輸出
執行後,您將收到以下輸出。
CakePHP - 驗證
在製作網站時,通常需要在進一步處理資料之前驗證某些內容。CakePHP 提供了驗證包,可以輕鬆構建用於驗證資料的驗證器。
驗證方法
CakePHP在Validation類中提供了各種驗證方法。下面列出了一些最常用的方法。
| 語法 | Add(string $field, array|string $name, array|Cake\Validation\ValidationRule $rule [] ) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位的規則集中新增新規則。如果第二個引數是陣列,則該欄位的規則列表將被第二個引數替換,而第三個引數將被忽略。 |
| 語法 | allowEmpty(string $field, boolean|string|callable $whentrue, string|null $messagenull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 允許欄位為空。 |
| 語法 | alphanumeric (string $field, string|null $messagenull, string|callable|null $whennull) |
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增字母數字規則。 |
| 語法 | creditCard(string $field , string $type'all', string|null $messagenull, string|callable|null $whennull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增信用卡規則。 |
| 語法 | Email(string $field , boolean $checkMXfalse, string|null $messagenull, string|callable|null, $whennull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增電子郵件驗證規則。 |
| 語法 | maxLength(string $field, integer $max, string|null $messagenull, string|callable|null $whennull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增字串長度驗證規則。 |
| 語法 | minLength(string $field, integer $min, string|null $messagenull, string|callable|null $whennull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增字串長度驗證規則。 |
| 語法 | notBlank(string $field, string|null $messagenull, string|callable|null $whennull) |
|---|---|
| 引數 |
|
| 返回值 | $this |
| 描述 | 向欄位新增notBlank規則。 |
CakePHP - 建立驗證器
可以透過在控制器中新增以下兩行來建立驗證器。
use Cake\Validation\Validator; $validator = new Validator();
驗證資料
建立驗證器後,我們可以使用驗證器物件來驗證資料。以下程式碼說明了如何驗證登入網頁的資料。
$validator->notEmpty('username', 'We need username.')->add(
'username', 'validFormat', ['rule' => 'email','message' => 'E-mail must be valid']);
$validator->notEmpty('password', 'We need password.');
$errors = $validator->errors($this->request->data());
使用$validator物件,我們首先呼叫了notEmpty()方法,這將確保使用者名稱不能為空。之後,我們連結了add()方法以新增另一個用於正確電子郵件格式的驗證。
之後,我們使用notEmpty()方法為密碼欄位添加了驗證,這將確認密碼欄位不能為空。
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('validation',['controller'=>'Valids','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/ValidsController.php處建立一個ValidsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/ValidsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Validation\Validator;
class ValidsController extends AppController{
public function index(){
$validator = new Validator();
$validator->notEmpty('username', 'We need username.')->add(
'username', 'validFormat', ['rule' => 'email','message' => 'E-mail must be valid']);
$validator->notEmpty('password', 'We need password.');
$errors = $validator->errors($this->request->getData());
$this->set('errors',$errors);
}
}
?>
在src/Template處建立一個名為Valids的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Valids/index.php
<?php
if($errors) {
foreach($errors as $error)
foreach($error as $msg)
echo '<font color="red">'.$msg.'</font><br>';
} else {
echo "No errors.";
}
echo $this->Form->create(NULL,array('url'=>'/validation'));
echo $this->Form->control('username');
echo $this->Form->control('password');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/validation
輸出
點選提交按鈕而不輸入任何內容。您將收到以下輸出。
Http客戶端
http客戶端可用於發出GET、POST、PUT等請求。
要使用http客戶端,請新增以下內容:
use Cake\Http\Client;
讓我們來看一個例子來理解HTTP客戶端的工作原理。
HTTP GET方法
要從給定的http url獲取資料,您可以執行以下操作:
$response = $http->get('https://jsonplaceholder.typicode.com/users');
如果您需要傳遞一些查詢引數,則可以按如下方式傳遞:
$response = $http->get('https://jsonplaceholder.typicode.com/users', ["id", 1]);
要獲取響應,您可以執行以下操作:
對於普通文字資料:
$response->getBody();
對於Json:
$response->getJson();
對於Xml:
$response->getXml()
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('getData',['controller'=>'Requests','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/RequestsController.php處建立一個RequestsController.php檔案。將以下程式碼複製到控制器檔案中。
src/Controller/RequestsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Http\Client;
class RequestsController extends AppController{
public function index(){
$http = new Client();
$response = $http->get('https://jsonplaceholder.typicode.com/users');
$stream = $response->getJson();
$this->set('response',$stream);
}
}
?>
在src/Template處建立一個名為Requests的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Requests/index.php
<h3>All Users from url : https://jsonplaceholder.typicode.com/users</h3>
<?php
if($response) {
foreach($response as $res => $val) {
echo '<font color="gray">Name: '.$val["name"].' Email -'.$val["email"].'</font><br>';
}
}
?>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/getData
輸出
點選提交按鈕而不輸入任何內容。您將收到以下輸出。
HTTP POST方法
要使用post,您需要按如下方式呼叫$http客戶端:
$response = $http->post('yoururl', data);
讓我們來看一個相同的例子。
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('postData',['controller'=>'Requests','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/RequestsController.php處建立一個RequestsController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。
src/Controller/RequestsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Http\Client;
class RequestsController extends AppController{
public function index(){
$http = new Client();
$response = $http->post('https://postman-echo.com/post', [
'name'=> 'ABC',
'email' => 'xyz@gmail.com'
]);
}
}
?>
在src/Template處建立一個名為Requests的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Requests/index.php
<h3>Testing Post Method</h3>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/postData
輸出
以下是程式碼的輸出:
同樣,您可以嘗試PUT方法。
$http = new Client();
$response = $http->put('https://postman-echo.com/post', [
'name'=> 'ABC',
'email' => 'xyz@gmail.com'
]);
CakePHP - 分頁
如果我們要顯示大量資料,可以使用分頁功能,CakePHP 4 提供了這個非常易於使用的功能。
我們有一個名為“articles”的表,包含以下資料:
讓我們使用分頁功能以頁面的形式顯示資料,而不是一次性顯示所有資料。
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('posts',['controller'=>'Posts','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/PostsController.php處建立一個PostsController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。
src/Controller/PostsController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
class PostsController extends AppController {
public function index(){
$this->loadModel('articles');
$articles = $this->articles->find('all')->order(['articles.id ASC']);
$this->set('articles', $this->paginate($articles, ['limit'=> '3']));
}
}
?>
使用以下方法獲取articles表中的資料:
$this->loadModel('articles');
$articles = $this->articles->find('all')->order(['articles.id ASC']);
要應用分頁,我們將每頁顯示3條記錄,方法如下:
$this->set('articles', $this->paginate($articles, ['limit'=> '3']));
這足以啟用articles表的分頁功能。
在src/Template處建立一個名為Posts的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Posts/index.php
<div>
<?php foreach ($articles as $key=>$article) {?>
<a href="#">
<div>
<p><?= $article->title ?> </p>
<p><?= $article->details ?></p>
</div>
</a>
<br/>
<?php
}
?>
<ul class="pagination">
<?= $this->Paginator->prev("<<") ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(">>") ?>
</ul>
</div>
頁碼列表的分頁如下所示:
<ul class="pagination">
<?= $this->Paginator->prev("<<") ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next(">>") ?>
</ul>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/posts
輸出
執行程式碼後,您將看到以下輸出:
點選下面的數字切換到下一頁,或使用下一頁或上一頁按鈕。
例如
您將看到page=2已附加到瀏覽器中的頁面URL。
CakePHP - 日期和時間
要在cakephp4中使用日期和時間,我們將使用可用的FrozenTime類。
要使用日期和時間,請在您的控制器中包含該類。
use Cake\I18n\FrozenTime;
讓我們來看一個例子,使用FrozenTime類顯示日期和時間。
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('datetime',['controller'=>'Dates','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/DatesController.php處建立一個DatesController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。
src/Controller/DatesController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\I18n\FrozenTime;
class DatesController extends AppController{
public function index(){
$time = FrozenTime::now();
$now = FrozenTime::parse('now');
$_now = $now->i18nFormat('yyyy-MM-dd HH:mm:ss');
$this->set('timenow', $_now);
$now = FrozenTime::parse('now');
$nice = $now->nice();
$this->set('nicetime', $nice);
$hebrewdate = $now->i18nFormat(\IntlDateFormatter::FULL, null, 'en-IR@calendar=hebrew');
$this->set("hebrewdate",$hebrewdate);
$japanesedate = $now->i18nFormat(\IntlDateFormatter::FULL, null, 'en-IR@calendar=japanese');
$this->set("japanesedate",$japanesedate);
$time = FrozenTime::now();
$this->set("current_year",$time->year);
$this->set("current_month",$time->month);
$this->set("current_day",$time->day);
}
}
?>
在src/Template處建立一個名為Dates的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Dates/index.php
<?php echo "The Current date and time is = ".$timenow; echo "<br/>"; echo "Using nice format available = ".$nicetime; echo "<br/>"; echo "Date and Time as per Hebrew Calender =" .$hebrewdate; echo "<br/>"; echo "Date and Time as per Japanese Calender =" .$japanesedate; echo "<br/>"; echo "Current Year = ".$current_year; echo "<br/>"; echo "Current Month = ".$current_month; echo "<br/>"; echo "Current Day = ".$current_day; ?>
透過訪問以下 URL 來執行上述示例:
https:///cakephp4/datetime
輸出
執行程式碼後,您將看到以下輸出:
CakePHP - 檔案上傳
要進行檔案上傳,我們將使用表單助手。這是一個檔案上傳的示例。
示例
按照以下程式所示,更改config/routes.php檔案。
config/routes.php
<?php
use Cake\Http\Middleware\CsrfProtectionMiddleware;
use Cake\Routing\Route\DashedRoute;
use Cake\Routing\RouteBuilder;
$routes->setRouteClass(DashedRoute::class);
$routes->scope('/', function (RouteBuilder $builder) {
$builder->registerMiddleware('csrf', new CsrfProtectionMiddleware([
'httpOnly' => true,
]));
$builder->applyMiddleware('csrf');
//$builder->connect('/pages',['controller'=>'Pages','action'=>'display', 'home']);
$builder->connect('fileupload',['controller'=>'Files','action'=>'index']);
$builder->fallbacks();
});
在src/Controller/FilesController.php處建立一個FilesController.php檔案。將以下程式碼複製到控制器檔案中。如果已建立,則忽略。
在src/中建立uploads/目錄。上傳的檔案將儲存在uploads/資料夾中。
src/Controller/FilesController.php
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\View\Helper\FormHelper;
class FilesController extends AppController {
public function index(){
if ($this->request->is('post')) {
$fileobject = $this->request->getData('submittedfile');
$uploadPath = '../uploads/';
$destination = $uploadPath.$fileobject->getClientFilename();
// Existing files with the same name will be replaced.
$fileobject->moveTo($destination);
}
}
}
?>
在src/Template處建立一個名為Files的目錄,並在該目錄下建立一個名為index.php的檢視檔案。將以下程式碼複製到該檔案中。
src/Template/Files/index.php
<?php
echo $this->Form->create(NULL, ['type' => 'file']);
echo $this->l;Form->file('submittedfile');
echo $this->Form->button('Submit');
echo $this->Form->end();
$uploadPath ='../uploads/';
$files = scandir($uploadPath, 0);
echo "Files uploaded in uploads/ are:<br/>";
for($i = 2; $i < count($files); $i++)
echo "File is - ".$files[$i]."<br>";
?>
為使用者列出儲存在uploads/資料夾中的檔案。透過訪問以下URL執行上述示例:
https:///cakephp4/fileupload
輸出
執行上述程式碼後,您應該看到以下輸出: