- Phalcon 教程
- Phalcon - 首頁
- Phalcon - 概述
- Phalcon - 環境設定
- Phalcon - 應用結構
- Phalcon - 功能
- Phalcon - 配置
- Phalcon - 控制器
- Phalcon - 模型
- Phalcon - 檢視
- Phalcon - 路由
- Phalcon - 資料庫連線
- Phalcon - 切換資料庫
- Phalcon - 腳手架應用
- Phalcon - 查詢語言
- Phalcon - 資料庫遷移
- Phalcon - Cookie 管理
- Phalcon - Session 管理
- Phalcon - 多語言支援
- Phalcon - 資源管理
- Phalcon - 表單處理
- Phalcon - 物件文件對映器 (ODM)
- Phalcon - 安全特性
- Phalcon 有用資源
- Phalcon 快速指南
- Phalcon - 有用資源
- Phalcon - 討論
Phalcon 快速指南
Phalcon - 概述
Phalcon作為PHP最新的框架之一被介紹,由一群充滿熱情的開發者開發。Phalcon是一個鬆散耦合的框架,這意味著它允許其物件根據應用程式的需求被視為粘合組件。
與PHP中的其他(傳統或現有)框架相比,Phalcon提供了一些獨特的特性。以下是Phalcon的一些最突出的特性:
它是一個完整的全棧開源框架。
使用者只需要很少的程式碼就能利用多個元件。
它可以用來建立獨立的框架。例如,如果我們只需要Phalcon的快取元件,我們可以在任何用純PHP或使用框架編寫的應用程式中使用它。
對於熟悉**模型-檢視-控制器 (MVC)** 和**物件關係對映 (ORM)** 的開發者來說,使用Phalcon就像易如反掌。
效能
Phalcon的效能是使其區別於其他傳統PHP框架的一個特性。Phalcon結合了PHP和C;兩者都可以作為獨立模組使用。Phalcon中每個請求的編譯速度都很快,這使得一切看起來都非常出色。
C語言
Phalcon相容C語言,提高了編譯速度。此外,C語言與Phalcon的結合提供了物件關係對映 (ORM),這為建立的模型提供了一致性。在Phalcon中建立的每個模型都與關係資料庫的表相關聯。Phalcon中的ORM完全是用C語言實現的。
開發者工具
開發者工具用於開發web應用程式。這些工具有助於生成包含所有功能(C - 建立,R - 讀取,U - 更新,D - 刪除)的腳手架應用程式。開發者工具還包括對在Phalcon中實現的第三方庫的可擴充套件支援。
物件關係對映
Phalcon支援各種資料庫。它不僅限於訪問關係資料庫。它支援關係資料庫和非關係資料庫,這為Phalcon框架錦上添花。
Phalcon與其他框架的比較
下表重點介紹了Phalcon與Yii和Laravel等其他流行框架的不同之處。
| Yii | Laravel | Phalcon | |
|---|---|---|---|
| 專案型別 | Yii有助於建立大型專案,例如論壇、入口網站、CMS、RESTful Web服務等。 | Laravel用於構建Web應用程式。它以其精美和複雜的語法而聞名。 | Phalcon用於設計各種專案。 |
| 資料庫支援 | Yii支援所有關係資料庫和非關係資料庫。 | Laravel支援所有關係資料庫。 | Phalcon平等地支援關係資料庫和非關係資料庫。 |
| 語言 | Yii框架完全是用PHP編寫的。 | Laravel是用PHP編寫的,並遵循MVC模式。 | Phalcon包含PHP和C語言。 |
| 可擴充套件性 | Yii對於小型和中型專案來說具有相當的可擴充套件性。 | Laravel對於各種專案都具有很高的可擴充套件性。 | 適合中等規模的專案。 |
| 效能 | 相對較低。 | 高,但與Phalcon相比較低。 | 高效能。 |
Phalcon - 環境設定
**前提條件** - 我們需要WAMP/LAMP/MAMP或XAMPP棧來使用此框架。
以下是Phalcon框架在Windows系統中安裝過程的步驟。
**步驟1** - Phalcon的安裝完全依賴於**dll**檔案。DLL(動態連結庫)建立Phalcon所需的包和外掛。
下載dll檔案的連結如下:https://phalconphp.com/en/download
**步驟2** - 下載所需的dll檔案。檢查系統的適當配置並下載所需的dll檔案。下載檔案後,將**phalcon-php.dll**解壓到**xampp**資料夾中的**/php/ext**目錄。
**步驟3** - 編輯**php.ini檔案**中的路徑,使其與其他**.dll**檔案的配置方式類似。
**步驟4** - 編輯路徑後,重啟**xampp/wamp**棧。一旦**.dll**檔案正確設定,它將清晰地顯示在儀表盤上。
**步驟5** - 下載包後,在系統屬性中設定路徑變數。
**步驟6** - **dll**檔案和Phalcon工具一起幫助建立專案/web應用程式。使用者可以透過命令提示符驗證Phalcon框架是否已成功安裝。輸出將如下面的截圖所示。
**步驟7** - 接收到必要的輸出後,使用以下命令建立一個專案:
phalcon create-project <project-name>
將顯示以下輸出。
**步驟8** - Web應用程式已成功建立。單擊以下URL:**https:///demo1**
輸出將如下面的截圖所示。這是Phalcon PHP的歡迎頁面。
Phalcon - 應用結構
在本章中,我們將討論Phalcon的應用程式結構。以下是Phalcon專案的完整目錄結構。
有一個根資料夾,它被認為是**程式碼庫**,對Web伺服器公開可用。它也稱為**Web目錄**。Web根目錄外的其他資料夾對Web伺服器和Phalcon專案不可訪問。
建立專案後,目錄結構將在**wamp/xampp**資料夾中顯示如下。考慮我們在上一章中建立的專案。
以下是專案的資料夾和子資料夾。
App
此資料夾包含所有重要的指令碼檔案和資料夾。整個Web應用程式都是基於“app”資料夾設計的。配置檔案有助於輔助應用程式順利執行所需的配置。
以下是給定Phalcon Web應用程式的app資料夾的詳細檢視。
它包含config、controllers、library、migrations、models和views。
Config
Phalcon中Web應用程式所需的所有配置都包含在此資料夾中。它包括與資料庫連線相關的資訊、如果有的第三方庫以及要包含的服務。
Controllers
此資料夾包含所有控制器。它們用於處理請求和生成響應。
Library
Web應用程式的第三方庫(除了現有的Phalcon框架)。
Migrations
此子資料夾包含與資料遷移相關的所有檔案,這些檔案也可以在任何其他框架中使用。
Models
模型包括與資料庫互動所需的所有邏輯。它實際上用於資料表示。
Views
它包含與Web應用程式相關的所有檢視。這些檢視在控制器的幫助下顯示給終端使用者。
Cache
此目錄包含與快取相關的資料,這有助於提高效能。
Public
它包含所有用於資源管理目的的資料夾,其中包含CSS、JavaScript、要上傳的檔案和一些元資料。
.htaccess 檔案
在Apache Web伺服器軟體上執行的Web伺服器使用**.htaccess**作為配置檔案。當它放置在一個目錄中時,所有必要的配置都在伺服器啟動時載入。
例如,可以使用**.htaccess**檔案配置網站,使其僅對特定IP地址可用。
Phalcon - 功能
**模型-檢視-控制器 (MVC)** 是一種用於開發基於Web的應用程式的軟體設計和結構模式。這種軟體架構將資訊的表示與使用者與它的互動分開。
MVC模型用三個邏輯層定義Web應用程式。
模型
模型是表示知識的物件。模型與其各個部分之間應該是一對一的關係。它包括所有用於資料庫連線和執行CRUD操作的邏輯。
檢視
檢視是其模型的視覺表示。檢視與其模型或其部分互動,並從模型獲取演示所需的資料。這是透過傳送請求和接收適當的響應來實現的。檢視包括終端使用者看到的所有資料。
控制器
控制器充當使用者和系統(模型和檢視)之間的中介。它透過檢視接受使用者的請求,將其傳送到模型。模型對其進行操作並將響應傳送到控制器,控制器透過檢視將其顯示為輸出給終端使用者。
控制器接收此類使用者輸出並將其轉換為適當的訊息。這些訊息由檢視用於顯示適當的響應。
Phalcon中的工作流程
Phalcon中的工作流程如下:
使用者與使用者介面(檢視)互動,並且互動透過某些方法/事件來維護。
這些方法和事件由控制器處理。
控制器透過更新使用者的操作來訪問模型。
檢視使用模型生成適當的輸出。
檢視從其模型中獲取資料。模型與檢視沒有直接互動。
使用者介面等待進一步的使用者互動,這從新的請求和響應週期開始。
Phalcon包含模型、檢視和控制器的目錄。下面的截圖提供了更好的場景。
所有業務邏輯都在控制器中描述,模型與資料庫互動,其中包含關於每個表的所有檔案。
**注意**:
在Phalcon Web應用程式中建立的所有控制器都擴充套件了**Phalcon\Mvc\Controller**。
與資料庫表相關聯的所有模型都擴充套件了**\Phalcon\Mvc\Model**。
Phalcon - 配置
Web應用程式的config資料夾包含以下檔案:
- config.php
- loader.php
- services.php
config.php
它包含資料庫連線和路由的配置,配置根據目錄路徑進行。
<?php
/*
* Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?:
realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config([
'database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'test',
'charset' => 'utf8',
],
'application' => [
'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH . '/controllers/',
'modelsDir' => APP_PATH . '/models/',
'migrationsDir' => APP_PATH . '/migrations/',
'viewsDir' => APP_PATH . '/views/',
'pluginsDir' => APP_PATH . '/plugins/',
'libraryDir' => APP_PATH . '/library/',
'cacheDir' => BASE_PATH . '/cache/',
'baseUri' => '/demo1/',
]
]);
loader.php
它擴充套件了現有的\Phalcon\Loader()類。載入器類註冊 Web 應用程式所需的目錄。
<?php
$loader = new \Phalcon\Loader();
/**
* We're a registering a set of directories taken from the configuration file
*/
$loader->registerDirs( [
$config->application->controllersDir,
$config->application->modelsDir
]
)->register();
services.php
此檔案關聯了實現 Web 專案服務的所有函式。它實現了Phalcon\Di介面。它還透過載入服務來實現服務的依賴注入。
基本上,config 資料夾內的 services.php 檔案充當所有服務的容器。此介面有助於初始化所有服務,例如資料庫連線、設定 Cookie、建立新會話或連線到 NoSQL 資料庫。
<?php
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Php as PhpEngine;
use Phalcon\Mvc\Url as UrlResolver;
use Phalcon\Mvc\View\Engine\Volt as VoltEngine;
use Phalcon\Mvc\Model\Metadata\Memory as MetaDataAdapter;
use Phalcon\Session\Adapter\Files as SessionAdapter;
use Phalcon\Flash\Direct as Flash;
/**
* Shared configuration service
*/
$di->setShared('config', function () {
return include APP_PATH . "/config/config.php";
});
/**
* The URL component is used to generate all kind of urls in the application
*/
$di->setShared('url', function () {
$config = $this->getConfig();
$url = new UrlResolver();
$url->setBaseUri($config->application->baseUri);
return $url;
});
/**
* Setting up the view component
*/
$di->setShared('view', function () {
$config = $this->getConfig();
$view = new View();
$view->setDI($this);
$view->setViewsDir($config->application->viewsDir);
$view->registerEngines([
'.volt' => function ($view) {
$config = $this->getConfig();
$volt = new VoltEngine($view, $this);
$volt->setOptions([
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_'
]);
return $volt;
},
'.phtml' => PhpEngine::class
]);
return $view;
});
/**
* Database connection is created based in the parameters defined in the configuration
file
*/
$di->setShared('db', function () {
$config = $this->getConfig();
$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
$connection = new $class([
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
'charset' => $config->database->charset
]);
return $connection;
});
Phalcon - 控制器
在 MVC 框架中,“C”代表控制器,它指的是 Web 應用程式的交換機。控制器執行的操作有助於將引數傳遞給檢視,以便它可以相應地顯示和響應使用者輸入。
例如,如果我們透過包含使用者名稱、電子郵件地址和密碼等使用者詳細資訊的登錄檔單進行註冊,然後單擊“提交”按鈕,則使用者插入或釋出的資料將透過控制器(藉助關聯的操作或函式)傳送。
控制器的功能
一個控制器接受來自檢視的輸入並與關聯的模型互動。
它透過向模型傳送命令來幫助更新模型的狀態。它還可以向關聯的檢視傳送命令,這有助於根據模型的狀態更改檢視的呈現。
控制器充當模型和檢視之間的中介。
Phalcon 中 MVC 的工作流程
下圖顯示了 Phalcon 中 MVC 的工作流程。(此處應插入流程圖)
在 Phalcon 中建立控制器的步驟
步驟 1 - 使用命令提示符跳轉到專案路徑。請參考以下螢幕截圖。(此處應插入螢幕截圖)
如上圖所示,“demo”是與 Phalcon PHP 框架關聯的專案。
步驟 2 - 使用以下命令建立關聯的控制器。
phalcon controller <controller-name>
以下是成功執行上述命令後的輸出。(此處應插入命令和輸出)
注意 - 控制器的類名必須以“Controller”結尾。這意味著在 Phalcon 中遵循良好的命名約定。
預設情況下,當在 Phalcon PHP 框架中建立應用程式時,它包含一個名為“IndexController”的控制器。預設情況下呼叫此控制器以觸發操作。
此控制器由控制器基類擴充套件,這與擴充套件\Phalcon\Mvc\Controller的其他控制器不同。
程式碼 - (此處應插入程式碼)
<?php
class IndexController extends ControllerBase {
public function indexAction() {
echo "This is my first web application in Phalcon";
}
}
輸出 - (此處應插入輸出)
Phalcon - 模型
MVC 架構中的模型包含應用程式的邏輯。模型是與資料庫的核心互動。它應該能夠根據使用者的請求管理記錄的更新、刪除、插入和獲取。
要了解 Phalcon PHP 框架中的模型互動,應遵循以下步驟。
步驟 1 - 建立資料庫。
對於任何LAMP、WAMP、XAMPP軟體棧,都可以使用phpmyadmin資料庫工具輕鬆建立資料庫。
以下是建立資料庫的 SQL 查詢。(此處應插入SQL查詢)
create database <database-name>
步驟 2 - 在phpmyadmin部分,單擊“資料庫”選項卡,提及資料庫名稱,然後單擊“建立”按鈕,如下圖所示。(此處應插入螢幕截圖)
步驟 3 - 成功建立資料庫後,建立一個表,這將有助於將其與在 Phalcon 框架中建立的模型關聯。
使用以下查詢建立一個名為“users”的新表。(此處應插入SQL查詢)
DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(25), `emailid` varchar(50), `contactNumber` number PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
建立表後,其結構如下面的螢幕截圖所示。(此處應插入螢幕截圖)
步驟 4 - 要建立與我們在上述步驟中建立的“Users”表關聯的模型,請開啟命令提示符例項。務必跳轉到相應的專案路徑。在此之前,務必檢查資料庫配置是否已正確設定,如下面的螢幕截圖所示。(此處應插入螢幕截圖)
步驟 5 - 使用以下命令在 Phalcon 框架中建立任何模型。(此處應插入命令)
phalcon model <model-name>
以下是執行上述命令後的輸出。(此處應插入輸出)
這意味著模型已成功建立。
步驟 6 - 成功建立的模型位於 models 資料夾中。使用以下路徑檢視模型的建立位置。(此處應插入路徑)
C:\xampp\htdocs\demo1\app\models
以下是Users.php的完整程式碼。(此處應插入程式碼)
<?php
class Users extends \Phalcon\Mvc\Model {
/**
*
* @var integer
* @Primary
* @Identity
* @Column(type = "integer", length = 11, nullable = false)
*/
public $id;
/**
*
* @var string
* @Column(type = "string", length = 25, nullable = true)
*/
public $name;
/**
*
* @var string
* @Column(type = "string", length = 50, nullable = true)
*/
public $emailid;
/**
*
* @var integer
* @Column(type = "integer", length = 11, nullable = true)
*/
public $contactNumber;
/**
* Returns table name mapped in the model.
*
* @return string
*/
public function getSource() {
return 'users';
}
/**
* Allows to query a set of records that match the specified conditions
*
* @param mixed $parameters
* @return Users[]
*/
public static function find($parameters = null) {
return parent::find($parameters);
}
/**
* Allows to query the first record that match the specified conditions
*
* @param mixed $parameters
* @return Users
*/
public static function findFirst($parameters = null) {
return parent::findFirst($parameters);
}
}
步驟 7 - 控制器與模型和檢視互動以獲取必要的輸出。與模型一樣,使用以下命令終端建立控制器。(此處應插入命令)
Phalcon controller <controller-name>
成功執行上述命令後,輸出如下。(此處應插入輸出)
以下是UserController.php的程式碼。(此處應插入程式碼)
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
echo "Users Controller has been called";
}
}
如果我們訪問以下 URL,將顯示輸出 - https:///demo1/users
Phalcon - 檢視
檢視是呈現給終端使用者的資料。檢視可以被認為是一個網頁,其中包含要顯示的相應響應。響應是透過與模型互動的控制器接收的。
具體來說,在 Phalcon 中,檢視由 Volt 程式碼、PHP 和 HTML 組成。可以使用一組特殊的定界符進入 Volt 模式。{% ... %} 用於執行語句,例如 for 迴圈或賦值,而 {{ ... }} 將表示式的結果列印到模板中。
Phalcon 中的檢視基本上分為兩種型別 -
- Volt
- phtml
Volt
以下是我們在上一章中為專案demo1建立的輸出的螢幕截圖。(此處應插入螢幕截圖)
此輸出是藉助檔案views/index/index.volt實現的。
Volt 檔案的功能
它是用 C 語言編寫的模板,與其他語言相比速度相當快。
它包含一組高度整合的元件,這在 Phalcon 中非常有益。
它也可以用作獨立元件。
Volt 編譯成純 PHP 程式碼。
以下是index.volt的程式碼,該程式碼預設情況下會為任何專案載入。(此處應插入程式碼)
<!--<div class = "page-header"> <h1>Congratulations!</h1> </div>--> <p>This is my first web application in Phalcon </p> <!--<p>You're now flying with Phalcon. Great things are about to happen!</p> <p>This page is located at <code>views/index/index.volt</code></p>-->
分層渲染
Phalcon 中的檢視支援分層渲染,並使用Phalcon\Mvc\View作為預設渲染元件。此元件使用 PHP 作為模板引擎,而 volt 檔案使用 C 作為模板語言。
這些檢視應具有.phtml副檔名。給定專案的檢視的預設目錄包含以下三個檔案 -
操作檢視 - 呼叫此檢視以執行特定操作。當執行“show”操作時呼叫它。
控制器佈局 - 此檢視位於 layouts 資料夾內。例如,C:\xampp\htdocs\demo\app\views\layouts。它呼叫與相應控制器關聯的方法呼叫。佈局中實現的程式碼將在需要時實現。
主佈局 - 此佈局檢視將呼叫主操作,並且將在 Web 應用程式中的每個控制器或操作中顯示。
.volt 和 .phtml 檔案之間的區別
| .volt | .phtml |
|---|---|
| 當應用程式中設定的模板引擎是用 C 編寫的時,使用 .volt 副檔名 | .phtml 用於模板引擎本身是 PHP 的情況 |
| 它可以用作獨立元件 | 它不能用作獨立元件 |
| Volt 檢視編譯成 PHP 程式碼 | phtml 檔案本身包含 PHP 程式碼,因此在 Phalcon 框架中無需編譯 |
變數
使用“set”在模板中分配和更改變數。
宣告陣列(此處應插入程式碼示例)
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
宣告字串(此處應插入程式碼示例)
{% set name = ”John Kennedy” %}
註釋
也可以使用{# ... #}定界符向模板添加註釋。最終輸出中忽略它們內部的所有文字。
{# note: this is a comment
{% set price = 100; %}
#}
示例(此處應插入程式碼示例)
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
<h1>Fruits</h1>
<ul>
{% for fruit in fruits %}
<li>{{ fruit|e }}</li>
{% endfor %}
</ul>
{% set robots = ['Voltron', 'Astro Boy', 'Terminator', 'C3PO'] %}
<ul>
{% for robot in robots %}
<li>{{ robot }}</li>
{% endfor %}
</ul>
輸出(此處應插入程式碼輸出)
程式碼將產生以下輸出螢幕 - (此處應插入螢幕截圖)
Phalcon - 路由
路由器元件允許定義對映到應接收請求的控制器或處理程式的路由。路由器根據接收到的資訊解析 URI。
Web 應用程式中的每個路由器都有兩種模式 -
- MVC 模式
- 僅匹配模式
第一種模式非常適合與 MVC 應用程式一起使用。以下是定義 Phalcon 中路由的語法。(此處應插入語法)
$router = new Router();
// Define a route
$router->add(
"<URI-Name>",
[
"controller" => "<controller-name>",
"action" => "<action-name>",
]
);
示例(此處應插入程式碼示例)
為了搜尋類別,讓我們在 config 資料夾的routes.php中建立一個路由。
考慮建立一個路由,當我們呼叫“UsersController”時,它將呼叫方法 login。在這種情況下,建議建立一個對映給定 URL 的路由。(此處應插入程式碼)
<?php
$router = new Phalcon\Mvc\Router();
$router->add('/login', array(
'controller' => 'users',
'action' => 'login',
));
return $router;
輸出(此處應插入程式碼輸出)
程式碼將產生以下輸出 - (此處應插入輸出)
Phalcon - 資料庫連線
在本章中,我們將討論與 Phalcon 相關的資料庫連線。
資料庫的建立和設計
我們將專注於為部落格建立資料庫,該資料庫維護帖子以及使用者的條目對應的類別。
資料庫名稱:blog-tutorial
用於建立資料庫的查詢 - (此處應插入SQL查詢)
drop database blog-tutorial (if exists) create database blog-tutorial
建立資料庫後,資料庫將如以下螢幕截圖所示列出。(此處應插入螢幕截圖)
Phalcon 使用命令建立模型、控制器,甚至是專案。讓我們看看它是如何工作的。
步驟 1 - 建立一個名為 blog-tutorial 的專案。(此處應插入命令)
步驟 2 - 配置連線到我們為管理部落格建立的資料庫的 Web 應用程式。
<?php
return new \Phalcon\Config (array (
'database' => array (
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
// 'dbname' => 'blog_tutorial',
'password' => '',
'name' => 'blog_tutorial',
),
'application' => array (
'controllersDir' => __DIR__ . '/../../app/controllers/',
'modelsDir' => __DIR__ . '/../../app/models/',
'viewsDir' => __DIR__ . '/../../app/views/',
'baseUri' => '/blog-tutorial/',
)
));
Phalcon - 切換資料庫
我們在應用程式中使用了 MySQL 資料庫。如果我們想中途更改資料庫軟體,這並不難,只要我們在新資料庫中具有相同的資料結構即可。
PostgreSQL
配置將連線到 PostgreSQL 資料庫的 Web 應用程式。
這可以使用以下程式碼實現。服務將包括Phalcon\Db\Adapter\Pdo\Postgresql(此處應插入程式碼)
use Phalcon\Db\Adapter\Pdo\Postgresql; $config = [ 'host' => 'localhost', 'dbname' => 'blog_tutorial', 'port' => 5432, 'username' => 'root', 'password' => '' ]; $connection = new Postgresql($config);
SQLite
為了實現 SQLite 連線,應使用Phalcon\Db\Adapter\Pdo\Sqlite抽象類擴充套件配置。(此處應插入程式碼)
<?php use Phalcon\Db\Adapter\Pdo\Sqlite; $connection = new Sqlite(['dbname' => '/tmp/blog_tutorial.sqlite']);
Oracle
為了在 Phalcon 中實現 Oracle 資料庫連線,應使用Phalcon\Db\Adapter\Pdo\Oracle抽象類擴充套件配置。(此處應插入程式碼)
<?php use Phalcon\Db\Adapter\Pdo\Oracle; $config = array ( "dbname" => "///blog_tutorial", "username" => "root", "password" => "" ); $connection = new Phalcon\Db\Adapter\Pdo\Oracle($config);
Phalcon - 腳手架應用
腳手架通常指一種程式碼生成方式,我們將它指向一個web應用程式資料庫,從而建立一個基本的CRUD(建立、讀取、更新、刪除)應用程式。
在設計CRUD應用程式之前,務必根據應用程式的需要設計資料庫表。
步驟 1 − 建立一個腳手架應用程式,其中將包含所有CRUD操作。
Command: phalcon scaffold <table-name>
Phalcon的腳手架生成器一旦執行,就會建立檔案和資料夾,這些檔案和資料夾在下面的表格中描述。
步驟 2 − 建立一個索引頁面(phtml和volt的組合)。
要包含在users資料夾中index.phtml中的程式碼。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css"
href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
預設檔案index.volt將包含以下程式碼。
<?php echo $this->getContent() ?> <div align = "center"> <h1>Welcome!</h1> <p>Welcome to the blog collection of Phalcon</p> </div>
上述程式碼成功執行後會產生以下輸出。
步驟 3 − 使用相應的模型進行更改。
Users.php
<?php
class Users extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $login;
/**
* @var string
*
*/
public $password;
/**
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "users_id");
}
}
名為‘initialize’的函式有助於實現Posts表中id和users_id之間的關係,這意味著每個唯一使用者在表中都有許多關聯的帖子。
Posts.php
<?php
class Posts extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $title;
/**
* @var string
*
*/
public $slug;
/**
* @var string
*
*/
public $content;
/**
* @var string
*
*/
public $created;
/**
* @var integer
*
*/
public $users_id;
/**
* @var integer
*
*/
public $categories_id;
/**
* Initializer method for model.
*/
public function initialize() {
$this->belongsTo("users_id", "Users", "id");
$this->belongsTo("categories_id", "Categories", "id");
}
}
‘initialize’函式包含關係約束,指明瞭與表的外部鍵和主鍵關係。
users_id 指的是“Users”表中的id。
categories_id 指的是“Categories”表中的id。
Categories.php
<?php
class Categories extends \Phalcon\Mvc\Model {
/**
* @var integer
*
*/
public $id;
/**
* @var string
*
*/
public $name;
/**
* @var string
*
*/
public $slug;
/**
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "categories_id");
}
}
與Users模型類似,‘initialize’函式指定它包含給定帖子的許多categories_id。
建立檢視
以下是Blog-tutorial-master專案的完整結構。
用於在使用者成功登入後顯示主頁的關聯檢視是“index.phtml”。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css" href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
Phalcon - 查詢語言
Phalcon查詢語言(PHQL),也稱為PhalconQL,是一種高階SQL方言,它標準化了Phalcon支援的資料庫系統的SQL查詢。
它包含一個用C語言編寫的解析器,該解析器將語法轉換為目標RDBMS。
以下是Phalcon查詢語言的一些突出功能的列表:
為了web應用程式的安全性,它使用繫結引數。
表被視為模型,而列被視為類屬性。
所有資料操作語句都用於防止可能發生的資料丟失。
透過一次只保留一個SQL查詢呼叫來防止SQL注入。
建立PHQL查詢
透過例項化類Phalcon\Mvc\Model\Query來建立查詢。
示例(此處應插入程式碼示例)
// Instantiate the Query $query = new Query( "SELECT * FROM Users", $this->getDI() ); // Execute the query returning a result if any $cars = $query->execute();
在前面的章節中,我們已經看到了名為部落格教程的腳手架web應用程式的工作原理。它包括根據名稱或slug搜尋類別。
以下是searchAction中包含的程式碼。
public function searchAction() {
$numberPage = 1;
if ($this->request->isPost()) {
$query = Criteria::fromInput($this->di, "Categories", $_POST);
$this->session->conditions = $query->getConditions();
} else {
$numberPage = $this->request->getQuery("page", "int");
if ($numberPage <= 0) {
$numberPage = 1;
}
}
$parameters = array();
if ($this->session->conditions) {
$parameters["conditions"] = $this->session->conditions;
}
// $parameters["order"] = "id";
$categories = Categories::find($parameters);
if (count($categories) == 0) {
$this->flash->notice("The search did not find any categories");
return $this->dispatcher->forward(array(
"controller" => "categories",
"action" => "index"
));
}
$paginator = new \Phalcon\Paginator\Adapter\Model(array(
"data" => $categories,
"limit"=> 10,
"page" => $numberPage
));
$page = $paginator->getPaginate();
$this->view->setVar("page", $page);
}
控制器中執行的PHQL查詢(突出顯示)將根據搜尋條件獲取所有結果。任何根據條件進行的搜尋查詢的結果都將如截圖所示顯示。
以下是上述程式碼成功執行後收到的輸出。
PHQL生命週期
作為一種高階語言,PHQL使開發人員能夠根據需求個性化和定製各個方面。
以下是Phalcon中執行的每個PHQL語句的生命週期:
每個PHQL語句都被解析並轉換為中間表示(IR),它完全獨立於資料庫系統實現的SQL。
IR根據web應用程式中使用的資料庫系統轉換為SQL語句。生成的SQL語句與模型相關聯。
所有PHQL語句都被解析一次並快取在記憶體中。如果執行相同的語句結果,它將有助於提高效能。
Phalcon - 資料庫遷移
資料庫遷移之所以重要,原因如下:
資料庫遷移有助於在指定的儲存型別之間傳輸資料。
資料庫遷移指的是基於web的應用程式從一個平臺遷移到另一個平臺的上下文。
此過程通常用於跟蹤已過時的資料。
Phalcon以以下方式執行資料庫遷移過程:
步驟 1 − 在xampp/wamp目錄中建立一個名為“dbProject”的專案。
步驟 2 − 使用適當的資料庫連線配置專案。
<?php
/*
* Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config(['database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'demodb',
'charset' => 'utf8', ],
'application' => [ 'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH .
'/controllers/', 'modelsDir' => APP_PATH .
'/models/', 'migrationsDir' => APP_PATH .
'/migrations/', 'viewsDir' => APP_PATH .
'/views/','pluginsDir' => APP_PATH .
'/plugins/', 'libraryDir' => APP_PATH .
'/library/', 'cacheDir' => BASE_PATH .
'/cache/', 'baseUri' => '/dbProject/',
] ]);
步驟 3 − 執行遷移資料庫“demodb”中包含的表的命令。目前,它包含一個表“users”。
步驟 4 − 遷移的資料庫檔案儲存在“app”資料夾內的migrations目錄中。
因此,表已成功遷移。
瞭解遷移檔案的結構
遷移檔案有一個唯一的類,它擴充套件了Phalcon\Mvc\Model\Migration類。Phalcon中的Migration類包含up()和down()方法。up()方法用於執行遷移,而down方法則回滾操作。
Users.php
<?php
use Phalcon\Db\Column;
use Phalcon\Db\Index;
use Phalcon\Db\Reference;
use Phalcon\Mvc\Model\Migration;
/**
* Class UserMigration_100
*/
class UserMigration_100 extends Migration {
/**
* Define the table structure
*
* @return void
*/
public function morph() {
$this->morphTable('user', [
'columns' => [
new Column( 'Id', [
'type' => Column::TYPE_INTEGER,
'notNull' => true,
'autoIncrement' => true,
'size' => 11, 'first' => true ] ),
new Column( 'username', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'Id' ] ),
new Column( 'email', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'username' ] ),
new Column( 'password', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 10,
'after' => 'email' ] )
],
'indexes' => [new Index('PRIMARY', ['Id'], 'PRIMARY') ],
'options' => [ 'TABLE_TYPE' => 'BASE TABLE',
'AUTO_INCREMENT' => '3', 'ENGINE' => 'InnoDB',
'TABLE_COLLATION' => 'latin1_swedish_ci' ],
] );
}
/**
* Run the migrations
* * @return void
*/
public function up() {
}
/**
* Reverse the migrations
*
* @return void
*/
public function down() {
}
}
如上例所示的類UserMigration_100包含一個關聯陣列,其中包含四個部分:
Columns − 包含一組表列。
Indexes − 包含一組表索引。
References − 包含所有引用完整性約束(外部索引鍵)。
Options − 包含一組表建立選項的陣列。
如上例所示,資料庫的1.0.0版本已成功遷移。Phalcon可能會包含並執行多個遷移過程,具體取決於資料庫內容的維護方式。
Phalcon - Cookie 管理
Cookie也稱為瀏覽器Cookie,是儲存在瀏覽器中的小型文字檔案。它儲存所有與使用者身份相關的資訊。此資訊用於在使用者瀏覽不同頁面時驗證使用者。
Cookie有兩種不同的型別:
會話Cookie − 此類Cookie會保留在瀏覽器中,並保留資訊,直到瀏覽器關閉。瀏覽器開啟後,它將被視為同一使用者的新的會話。
永續性Cookie − 它包含一個規定的壽命,並在給定的壽命內保留在瀏覽器中。使用永續性Cookie的那些網站會跟蹤每個使用者,即使使用者關閉了瀏覽器。
現在讓我們討論Cookie在Phalcon中的工作方式。
Phalcon中的Cookie
Phalcon使用Phalcon\Http\Response\Cookies作為Cookie的全域性儲存。在向伺服器傳送請求時,Cookie儲存在Phalcon中。
以下是設定Cookie的語法:
$this->cookies->set( "<cookie-name>", "<cookie-value>", time );
考慮以下示例。使用以下程式碼,我們將在使用者登入web應用程式時建立使用者的Cookie。
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
if ($this->cookies->has("login-action")) {
// Get the cookie
$loginCookie = $this->cookies->get("login-action");
// Get the cookie's value
$value = $loginCookie->getValue();
echo($value);
}
$this->cookies->set(
"login-action",
"abc",
time() + 15 * 86400
);
}
}
加密的Cookie將顯示為輸出。
描述
名為“loginAction”的Cookie已建立,值為“abc”。
“indexAction”方法檢查Cookie是否存在,並相應地列印值。
Cookie加密
Phalcon中的Cookie在作為請求傳送到伺服器之前會被加密,並在我們從伺服器獲得適當的響應後立即解密。這確保了授權使用者的安全。
建議即使具有加密和解密功能,也應避免在Cookie中儲存敏感資料。Cookie加密的配置包含在services.php檔案中。
/**
* Enable encryption key for setting values of cookies
*/
$di->set(
"cookies", function () {
$cookies = new Cookies();
$cookies->useEncryption(false);
return $cookies;
}
);
/**
* Set encryption key
*/
$di->set(
"crypt", function () {
$crypt = new Crypt();
$crypt->setKey('AED@!sft56$'); // Use a unique Key!
return $crypt;
}
);
**注意**:
建議在向伺服器傳送Cookie時使用加密。
如果不使用加密,所有內部應用程式都將暴露給攻擊者。
還建議在Cookie中儲存少量資料和文字。
Phalcon - Session 管理
會話是伺服器端資訊儲存,有助於使用者與網站或web應用程式互動。每個會話都由一個會話ID唯一定義,該會話ID在瀏覽器發出HTTP請求時傳遞給web伺服器。會話ID每次都與內部資料庫配對,以便檢索所有儲存的變數。
Phalcon中的會話
Phalcon使用會話元件,其中包括訪問會話資料的包裝器。
以下是Phalcon中的功能:
會話資料可以與同一域上的其他元件隔離。
根據應用程式的需求,可以使用會話介面卡更改會話值。
在Phalcon中啟動會話
所有會話活動都與在web應用程式的/config資料夾內的Services.php檔案中宣告的介面卡檔案相關聯。
/**
* Start the session the first time some component requests the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});
建立會話
步驟 1 − 建立一個會話控制器來例項化會話,以便可以適當地檢索資料。
步驟 2 − 建立一個具有名稱和值的會話。
<?php
class SessionController extends \Phalcon\Mvc\Controller {
public function indexAction() {
//Define a session variable
$this->session->set("user-name", "Omkar");
//Check if the variable is defined
if ($this->session->has("user-name")) {
//Retrieve its value
$name = $this->session->get("user-name");
echo($name);
}
}
}
上述程式碼產生以下輸出。
刪除會話
可以在Phalcon中銷燬會話或取消設定會話中的一些變數值。
以下是取消設定會話中變數值的語法。
$this->session->remove(<variable-name>);
如上例所示,在會話中建立的變數名為“data-content”,可以使用以下程式碼將其刪除。
public function removeAction() {
// Remove a session variable with associated session
$this->session->remove("data-content");
}
;
以下是銷燬整個會話的語法。
$this->session->destroy();
Phalcon - 多語言支援
Phalcon包含一個元件Phalcon\Translate,它提供多語言支援,對於建立可以翻譯成多種語言的網頁非常有幫助。
它包含一個介面卡,有助於繫結陣列並幫助讀取翻譯訊息。
示例(此處應插入程式碼示例)
讓我們在Phalcon中使用Translate元件建立一個輸出,這將有助於根據建議的語言顯示輸出。
步驟 1 − Phalcon讓每個開發人員都可以自由地組織翻譯字串。考慮保留兩個不同的檔案:en.php(用於英語字串)和fr.php(用於法語字串)。
該檔案將包含一個鍵值對陣列,其中鍵是唯一的,值將根據所需的翻譯而有所不同。
en.php
<?php // app/messages/en.php $messagesContent = [ "bye" => "Good Bye", "hi-name" => "Hello %name%", "song" => "Your favorite song is %song%", ];
fr.php
<?php // app/messages/fr.php $messagesContent = [ "bye" => "Au revoir", "hello-name" => "Bonjour %name%", "song" => "Votre chanson préférée est %song%", ];
步驟 2 − 在應用程式中,建立一個UserController,它將引數作為要用於翻譯的檔案。
<?php
use Phalcon\Translate\Adapter\NativeArray;
class UserController extends \Phalcon\Mvc\Controller {
protected function getMessageTransalation() {
// Ask for the best language
// Display the output in desired language
require "en.php";
// Return a translation object
return new NativeArray( ["content" => $messagesContent,]);
}
public function indexAction() {
$this->view->name = "Radhika";
$this->view->song= "Ton sourire m'ensorcelle Je suis fou de toi Le désir coule dans mes veines Guidé par ta voix";
$this->view->t = $this->getMessageTransalation();
}
}
對於預設方法,採用兩個引數,第一個是名稱,第二個是使用者的喜愛的歌曲。稍後,將呼叫函式getMessageTranslation,該函式返回所需的輸出。
目前,我們希望輸出為英語。
步驟 3 − 關聯的程式碼檢視demo\app\views\User\index.volt將包含以下程式碼:
<p><?php echo $t->_("hello-name", ["name" => $name]); ?></p>
<p><?php echo $t->_("song", ["song" => $song]); ?></p>
如果我們希望完整的輸出以法語顯示,我們只需要更改檔名即可。
require "fr.php";
以下是法語輸出。
Phalcon - 資源管理
資源管理器(Assets)是Phalcon框架之外的附加元件。Phalcon擁有一個資源管理器,用於管理所有資源元件,例如CSS或JS檔案。
常用的方法包括:
| 方法 | 作用 |
|---|---|
| __construct(variable $options) | 初始化Phalcon\Assets\Manager元件 |
| addCss(string $path, variable $local, variable $filter, variable $attributes) | 將CSS資源從'css'集合新增到特定檢視 |
| addJs(string $path, variable $local, variable $filter, variable $attributes) | 將JavaScript資源新增到'js'集合 |
示例(此處應插入程式碼示例)
考慮Phalcon的示例專案**“vokuro”**,它是新增**css**檔案的最佳示例。它將包含assets/Manager來呼叫所有**css**檔案。
專案的預設控制器將呼叫所有**css**檔案。
<?php
namespace Vokuro\Controllers;
use Phalcon\Assets\Manager;
/**
* Display the default index page.
*/
class IndexController extends ControllerBase {
/**
* Default action. Set the public layout (layouts/public.volt)
*/
public function indexAction() {
$this->assets->addCss("public/style.css");
$this->view->setVar('logged_in', is_array($this->auth->getIdentity()));
$this->view->setTemplateBefore('public');
}
}
Style.css
div.remember {
margin-top: 7px;
color: #969696;
}
div.remember label {
padding-top: 15px;
}
div.forgot {
margin-top: 7px;
color: #dadada;
}
footer {
background: url("../img/feature-gradient.png") no-repeat scroll center 100% white;
color: #B7B7B7;
font-size: 12px;
padding: 30px 0;
text-align: center;
}
footer a {
margin-left: 10px;
margin-right: 10px;
}
table.signup td {
padding: 10px;
}
table.signup .alert {
margin-bottom: 0;
margin-top: 3px;
}
table.perms select {
margin-top: 5px;
margin-right: 10px;
}
table.perms label {
margin-right: 10px;
}
div.main-container {
min-height: 450px;
}
資源將在檢視內管理,並將css檔案顯示為輸出。
Index.volt
{{ content() }}
{{ assets.outputCss() }}
<header class = "jumbotron subhead" id = "overview">
<div class = "hero-unit">
<h1>Welcome!</h1>
<p class = "lead">This is a website secured by Phalcon Framework</p>
<div align = "right">
{{ link_to('session/signup', '<i class="icon-ok icon-white">
</i> Create an Account', 'class': 'btn btn-primary btn-large') }}
</div>
</div>
</header>
輸出(此處應插入程式碼輸出)
它將產生以下輸出:
Phalcon - 表單處理
表單用於所有Web應用程式,用於接受使用者請求作為輸入。資料作為輸入接受,然後進行處理並儲存到資料庫中,或執行任何其他操作。
Phalcon包含一個名為**Phalcon\Forms**的元件,它有助於建立和維護表單。
考慮我們在前面章節中建立的Blog教程示例。它包含一個用於建立新類別的表單。
<?php echo \Phalcon\Tag::form(array("categories/create", "autocomplete" => "off")) ?>
<table width = "100%">
<tr>
<td align = "left">
<?php echo \Phalcon\Tag::linkTo(array("categories", "Go Back", "class" => "btn")) ?>
</td>
<td align = "right"><
?php echo \Phalcon\Tag::submitButton(array("Save", "class" => "btn")) ?>
</td>
<tr>
</table>
<?php echo $this->getContent(); ?>
<div align = "center">
<h1>Create categories</h1>
</div>
<table align = "center">
<tr>
<td align = "right">
<label for = "name">Name</label>
</td>
<td align = "left">
<?php echo \Phalcon\Tag::textField(array("name", "size" => 30)) ?>
</td>
</tr>
<tr>
<td align = "right">
<label for = "slug">Slug</label>
</td>
<td align = "left">
<?php echo \Phalcon\Tag::textField(array("slug", "size" => 30)) ?>
</td>
</tr>
</table>
</form>
**輸出** - 它將產生以下輸出。
表單的輸入欄位藉助**Phalcon/tag**元件進行渲染。表單中的每個元素都可以根據開發人員的要求進行渲染。
以下是渲染值的語法。
echo $form->render(element-name)
**驗證** -
一旦值在控制器中渲染,這些值將藉助模型輸入資料庫。Phalcon表單與驗證元件整合,以提供即時驗證。可以為每個元素設定內建或自定義驗證器。
<?php use Phalcon\Forms\Element\Text; use Phalcon\Validation\Validator\PresenceOf; use Phalcon\Validation\Validator\StringLength; $name = new Text( "Name" ); $name->addValidator( new PresenceOf([ "message" => "name is required", ]) ); $form->add($name);
**輸出** - 它將產生以下輸出。
Phalcon - 物件文件對映器 (ODM)
在開始學習**物件關係對映器 (ORM)** 和物件文件對映器 (ODM) 的概念之前,瞭解SQL和NoSQL資料庫之間的區別非常重要。
下表重點介紹了SQL和NoSQL之間的區別:
| SQL | NoSQL |
|---|---|
| 也稱為關係資料庫 (RDBMS) | 稱為非關係型資料庫或分散式資料庫 |
| 資料庫結構由表和檢視構成 | 它由基於文件的資料庫和圖資料庫組成 |
| 它包含預定義的模式 | 它具有動態模式 |
| 它在定義和操作資料方面非常強大 | 它在維護資料作為文件集合方面非常強大 |
Phalcon能夠與SQL和NoSQL資料庫對映。這是藉助於NoSQL資料庫的物件文件對映器 (ODM) 和SQL資料庫的物件關係對映器 (ORM) 來實現的。
在Phalcon中,ORM的概念包括建立一個與給定表名關聯的模型,就像我們在前面章節中看到的那樣。它遵循所有引用完整性約束。
物件文件對映器 (ODM)
它是與NoSQL資料庫關聯的物件。顧名思義,它對映文件相關的模組。Phalcon使用它來對映MongoDB等資料庫。
示例(此處應插入程式碼示例)
**步驟1** - 建立名為**“test”**的MongoDB資料庫。我們將使用此資料庫進行對映並獲得相應的響應。
**步驟2** - 檢查資料庫中插入的記錄。與之相關的命令是:
db.collection.find()
可以看出,每個文件都與ObjectId對映,這是ODM的一個特性。**ObjectId**的值是唯一的,以後用於獲取與該特定ID相關的儲存的所有資料。
**步驟3** - 為建立的資料庫設定模型。模型是一個擴充套件**Phalcon\Mvc\Collection**的類。**Test.php**模型將包含以下程式碼。
<?php
use Phalcon\Mvc\Collection;
class Test extends Collection {
public function initialize() {
$this->setSource("test");
}
}
**步驟4** - 在**services.php**中配置專案,包括資料庫連線。
// Simple database connection to localhost
$di->set(
"mongo",
function () {
$mongo = new MongoClient();
return $mongo->selectDB("test");
},
true
);
// Connecting to a domain socket, falling back to localhost connection
$di->set(
"mongo",
function () {
$mongo = new MongoClient(
"mongodb:///tmp/mongodb-27017.sock,localhost:27017"
);
return $mongo->selectDB("test");
},
true
);
**步驟5** - 使用**TestController.php**列印與**ObjectId**相關的值。
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller {
public function index() {
// Find record with _id = "5087358f2d42b8c3d15ec4e2"
$test = Test::findById("5819ab6cfce9c70ac6087821");
echo $test->data;
}
}
輸出將顯示與objectId匹配的資料。如果objectId與文件中的記錄不匹配,則不會顯示相應的輸出,因為獲取的記錄數量是有限的。
Phalcon - 安全特性
Phalcon藉助於安全元件提供安全功能,這有助於執行某些任務,例如密碼雜湊和**跨站點請求偽造 (CSRF)**。
雜湊密碼
**雜湊**可以定義為將固定長度的位字串轉換為指定長度的過程,以使其無法反轉。輸入字串的任何更改都會改變雜湊資料的的值。
雜湊資料的解密是透過將使用者輸入的值作為輸入並將其與相同的雜湊形式進行比較來實現的。通常對於任何基於Web的應用程式,將密碼儲存為純文字是一種不好的做法。它容易受到第三方攻擊,因為那些有權訪問資料庫的人可以輕鬆獲取任何使用者的密碼。
Phalcon提供了一種簡單的方法來以加密形式儲存密碼,該加密形式遵循諸如**md5、base64**或**sh1**之類的演算法。
正如我們在前面的章節中所看到的,我們在那裡建立了一個部落格專案。登入螢幕接受使用者名稱和密碼作為使用者的輸入。為了接收使用者的密碼並以特定形式對其進行解密,使用了以下程式碼片段。
然後將解密的密碼與從使用者處接受的輸入密碼進行匹配。如果值匹配,則使用者可以成功登入到Web應用程式,否則將顯示錯誤訊息。
<?php
class UsersController extends Phalcon\Mvc\Controller {
public function indexAction() {
}
public function registerUser() {
$user = new Users();
$login = $this->request->getPost("login");
$password = $this->request->getPost("password");
$user->login = $login;
// Store the hashed pasword
$user->password = $this->security->sh1($password);
$user->save();
}
public function loginAction() {
if ($this->request->isPost()) {
$user = Users::findFirst(array(
'login = :login: and password = :password:',
'bind' => array(
'login' => $this->request->getPost("login"),
'password' => sha1($this->request->getPost("password"))
)
));
if ($user === false) {
$this->flash->error("Incorrect credentials");
return $this->dispatcher->forward(array(
'controller' => 'users',
'action' => 'index'
));
}
$this->session->set('auth', $user->id);
$this->flash->success("You've been successfully logged in");
}
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
public function logoutAction() {
$this->session->remove('auth');
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
}
儲存在資料庫中的密碼採用**sh1**演算法的加密格式。
一旦使用者輸入正確的使用者名稱和密碼,使用者就可以訪問系統,否則將顯示錯誤訊息作為驗證。
跨站點請求偽造 (CSRF)
這是一種攻擊,它迫使Web應用程式的已認證使用者執行某些不需要的操作。接受使用者輸入的表單容易受到此攻擊。Phalcon試圖透過保護透過應用程式外部的表單傳送的資料來防止此攻擊。
每個表單中的資料都透過令牌生成來保護。生成的令牌是隨機的,它與我們傳送表單資料的令牌匹配(大多數情況下透過POST方法在Web應用程式外部)。
程式碼
<?php echo Tag::form('session/login') ?>
<!-- Login and password inputs ... -->
<input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>"
value = "<?php echo $this->security->getToken() ?>"/>
</form>
**注意** - 傳送表單令牌時,務必使用會話介面卡,因為所有資料都將儲存在會話中。
在**services.php**中使用以下程式碼包含會話介面卡。
/**
* Start the session the first time some component request the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});