- Symfony 教程
- Symfony - 首頁
- Symfony - 簡介
- Symfony - 安裝
- Symfony - 架構
- Symfony - 元件
- Symfony - 服務容器
- Symfony - 事件與事件監聽器
- Symfony - 表示式
- Symfony - Bundles
- 建立簡單的 Web 應用
- Symfony - 控制器
- Symfony - 路由
- Symfony - 檢視引擎
- Symfony - Doctrine ORM
- Symfony - 表單
- Symfony - 驗證
- Symfony - 檔案上傳
- Symfony - Ajax 控制
- Cookie 與會話管理
- Symfony - 國際化
- Symfony - 日誌
- Symfony - 郵件管理
- Symfony - 單元測試
- Symfony - 高階概念
- Symfony - REST 版本
- Symfony - CMF 版本
- 完整的執行示例
- Symfony 有用資源
- Symfony - 快速指南
- Symfony - 有用資源
- Symfony - 討論
Symfony - 元件
如前所述,Symfony 元件是獨立的 PHP 庫,提供特定功能,可用於任何 PHP 應用程式。每個 Symfony 版本都會引入有用的新元件。目前,Symfony 框架中有 30 多個高質量元件。本章我們將學習如何在應用程式中使用 Symfony 元件。
安裝 Symfony 元件
可以使用 composer 命令輕鬆安裝 Symfony 元件。可以使用以下通用命令安裝任何 Symfony 元件。
cd /path/to/project/dir composer require symfony/<component_name>
讓我們建立一個簡單的 php 應用程式並嘗試安裝 **Filesystem** 元件。
**步驟 1** - 為應用程式建立一個資料夾,**filesystem-example**
cd /path/to/dev/folder mdkir filesystem-example cd filesystem-example
**步驟 2** - 使用以下命令安裝 Filesystem 元件。
composer require symfony/filesystem
**步驟 3** - 建立一個檔案 **main.php** 並輸入以下程式碼。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
$fs = new Filesystem();
try {
$fs->mkdir('./sample-dir');
$fs->touch('./sample-dir/text.txt');
} catch (IOExceptionInterface $e) {
echo $e;
}
?>
第一行非常重要,它載入使用 Composer 命令安裝的所有元件中所有必要的類。接下來的幾行使用 Filesystem 類。
**步驟 4** - 使用以下命令執行應用程式,它將在其中建立一個新資料夾 **sample-dir** 和一個檔案 **test.txt**。
php main.php
Symfony 元件詳情
Symfony 提供的元件範圍從簡單的功能(例如檔案系統)到高階功能(例如事件、容器技術和依賴注入)。讓我們在以下部分逐一瞭解所有元件。
Filesystem
Filesystem 元件提供與檔案和目錄相關的基本系統命令,例如檔案建立、資料夾建立、檔案是否存在等。可以使用以下命令安裝 Filesystem 元件。
composer require symfony/filesystem
Finder
Finder 元件提供流暢的類來查詢指定路徑中的檔案和目錄。它提供了一種簡單的方法來迭代路徑中的檔案。可以使用以下命令安裝 Finder 元件。
composer require symfony/finder
Console
Console 元件提供各種選項來輕鬆建立可在終端中執行的命令。Symfony 廣泛使用 **Command** 元件來提供各種功能,例如建立新的應用程式、建立 Bundle 等。甚至可以使用 Symfony 命令 `php bin/console server:run` 呼叫 PHP 內建的 Web 伺服器,如安裝部分所示。可以使用以下命令安裝 **Console** 元件。
composer require symfony/console
讓我們建立一個簡單的應用程式,並使用 **Console** 元件建立一個命令 **HelloCommand** 並呼叫它。
**步驟 1** - 使用以下命令建立一個專案。
cd /path/to/project composer require symfony/console
**步驟 2** - 建立一個檔案 **main.php** 幷包含以下程式碼。
<?php require __DIR__ . '/vendor/autoload.php'; use Symfony\Component\Console\Application; $app = new Application(); $app->run(); ?>
**Application** 類設定了基本控制檯應用程式的必要功能。
**步驟 3** - 執行應用程式 `php main.php`,將產生以下結果。
Console Tool
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output,
2 for more verbose output and 3 for debug
Available commands:
help Displays help for a command
list Lists commands
**步驟 4** - 在 **main.php** 中建立一個名為 **HelloCommand** 的類,它擴充套件了 **Command** 類。
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
class HelloCommand extends Command {
}
該應用程式使用了 **Command** 元件中以下四個類。
**Command** - 用於建立新命令
**InputInterface** - 用於設定使用者輸入
**InputArgument** - 用於獲取使用者輸入
**OutputInterface** - 用於將輸出列印到控制檯
**步驟 5** - 建立一個函式 **configure()** 並設定名稱、描述和幫助文字。
protected function configure() {
$this
->setName('app:hello')
->setDescription('Sample command, hello')
->setHelp('This command is a sample command')
}
**步驟 6** - 為命令建立一個輸入引數 **user** 並將其設定為必需的。
protected function configure() {
$this
->setName('app:hello')
->setDescription('Sample command, hello')
->setHelp('This command is a sample command')
->addArgument('name', InputArgument::REQUIRED, 'name of the user');
}
**步驟 7** - 建立一個具有兩個引數 **InputArgument** 和 **OutputArgument** 的函式 **execute()**。
protected function execute(InputInterface $input, OutputInterface $output) {
}
**步驟 8** - 使用 **InputArgument** 獲取使用者輸入的使用者詳細資訊,並使用 **OutputArgument** 將其列印到控制檯。
protected function execute(InputInterface $input, OutputInterface $output) {
$name = $input->getArgument('name');
$output->writeln('Hello, ' . $name);
}
**步驟 9** - 使用 **Application** 類的 **add** 方法將 **HelloCommand** 註冊到應用程式中。
$app->add(new HelloCommand());
完整的應用程式如下所示。
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
class HelloCommand extends Command {
protected function configure() {
$this
->setName('app:hello')
->setDescription('Sample command, hello')
->setHelp('This command is a sample command')
->addArgument('name', InputArgument::REQUIRED, 'name of the user');
}
protected function execute(InputInterface $input, OutputInterface $output) {
$name = $input->getArgument('name');
$output->writeln('Hello, ' . $name);
}
$app = new Application();
$app->add(new HelloCommand());
$app->run();
}
?>
**步驟 10** - 現在,使用以下命令執行應用程式,結果將如預期的那樣為 Hello, Jon。
php main.php app:hello Jon
Symfony 在任何 Symfony Web 應用程式的 bin 目錄中都帶有一個預構建的二進位制檔案,名為 **console**,可用於呼叫應用程式中的命令。
Process
Process 元件提供選項以安全有效的方式在子程序中執行任何系統命令。可以使用以下命令安裝 Process 元件。
composer require symfony/process
ClassLoader
ClassLoader 元件提供 **PSR-0** 和 **PSR-4** 類載入器標準的實現。它可用於自動載入類。它將在不久的將來被棄用。基於 Composer 的類載入器優於此元件。可以使用以下命令安裝 ClassLoader 元件。
composer require symfony/class-loader
PropertyAccess
PropertyAccess 元件提供各種選項,可以使用字串表示法讀取和寫入物件和陣列詳細資訊。例如,可以使用 **[price]** 字串動態訪問具有鍵 **price** 的陣列 **Product**。
$product = array( 'name' => 'Cake' 'price' => 10 ); var priceObj = $propertyAccesserObj->getValue($product, '[price]');
可以使用以下命令安裝 PropertyAccess 元件。
composer require symfony/property-access
PropertyInfo
PropertyInfo 元件類似於 PropertyAccess 元件,但它僅適用於 PHP 物件並提供更多功能。
class Product {
private $name = 'Cake';
private $price = 10;
public function getName() {
return $this->name;
}
public function getPrice() {
return $this->price;
}
}
$class = Product::class;
$properties = $propertyInfoObj->getProperties($class);
/*
Example Result
--------------
array(2) {
[0] => string(4) "name"
[1] => string(5) "price"
}
*/
可以使用以下命令安裝 PropertyInfo 元件。
composer require symfony/property-info
EventDispatcher
EventDispatcher 元件在 PHP 中提供基於事件的程式設計。它使物件可以透過排程事件和監聽事件來相互通訊。我們將在“事件和事件監聽器”一章中學習如何建立事件和監聽事件。
可以使用以下命令安裝 EventDispatcher 元件。
composer require symfony/event-dispatcher
DependencyInjection
DependencyInjection 元件提供了一種簡單有效的方法來建立具有其依賴項的物件。當專案發展壯大時,它具有許多具有深度依賴關係的類,需要正確處理。否則,專案將失敗。DependencyInjection 提供了一個簡單而強大的容器來處理依賴關係。我們將在“服務容器”一章中學習有關容器和依賴注入概念的知識。
可以使用以下命令安裝 DependencyInjection 元件。
composer require symfony/dependency-injection
Serializer
Serializer 元件提供一個選項,可以將 PHP 物件轉換為特定格式(例如 XML、JSON、Binary 等),然後允許將其轉換回原始物件而不會丟失任何資料。
可以使用以下命令安裝 Serializer 元件。
composer require symfony/serializer
Config
Config 元件提供選項來載入、解析、讀取和驗證 XML、YAML、PHP 和 ini 型別的配置。它還提供各種選項來從資料庫載入配置詳細資訊。這是在清晰簡潔的方式下配置 Web 應用程式的有用重要元件之一。可以使用以下命令安裝 Config 元件。
composer require symfony/config
ExpressionLanguage
ExpessionLanguage 元件提供了一個功能齊全的表示式引擎。表示式是一行程式碼,旨在返回值。表示式引擎使能夠輕鬆編譯、解析和從表示式獲取值。它使非 PHP 程式設計師(例如系統管理員)能夠在配置環境(檔案)中使用一個或多個表示式。
composer require symfony/expression-language
可以使用以下命令安裝 ExpressionLanguage 元件。
OptionsResolver
$options = array( 'host' => '<db_host>', 'username' => '<db_user>', 'password' => '<db_password>', ); $resolver = new OptionsResolver(); $resolver->setDefaults(array( 'host' => '<default_db_host>', 'username' => '<default_db_user>', 'password' => '<default_db_password>', )); $resolved_options = $resolver->resolve($options);
OptionsResolver 元件提供了一種驗證系統中使用的選項系統的方法。例如,資料庫設定放在一個數組 `dboption` 中,其中 `host`、`username`、`password` 等作為鍵。在使用它連線到資料庫之前,需要驗證條目。OptionsResolver 透過提供簡單的類 OptionsResolver 和方法 resolver 來簡化此任務,該方法解析資料庫設定,如果存在任何驗證問題,它將報告該問題。
composer require symfony/options-resolver
可以使用以下命令安裝 OptionsResolver 元件。
Dotenv
composer require symfony/dotenv
Dotenv 元件提供各種選項來解析 .env 檔案,並且在其中定義的變數可以透過 `getenv()`、`$_ENV` 或 `$_SERVER` 訪問。可以使用以下命令安裝 Dotenv 元件。
Cache
composer require symfony/cache
Cache 元件提供了擴充套件的 **PSR-6** 實現。它可用於向 Web 應用程式新增快取功能。由於它遵循 **PSR-6**,因此易於上手,並且可以輕鬆地替代其他基於 PSR-6 的快取元件。可以使用以下命令安裝 Cache 元件。
Intl
composer require symfony/intl
Intl 元件是 C Intl 擴充套件的替代庫。可以使用以下命令安裝 Intl 元件。
Translation
composer require symfony/translation
Translation 元件提供各種選項來國際化我們的應用程式。通常,不同語言的翻譯詳細資訊將儲存在一個檔案中,每種語言一個檔案,並在應用程式執行時動態載入。有不同的格式來編寫翻譯檔案。Translation 元件提供各種選項來載入任何型別的格式,例如純 PHP 檔案、CSV、ini、Json、Yaml、ICU 資原始檔等。可以使用以下命令安裝 Translation 元件。
Workflow
Workflow 元件提供高階工具來處理有限狀態機。透過以簡單且面向物件的方式提供此功能,Workflow 元件使 PHP 中的高階程式設計相對容易。我們將在高階概念一章中詳細瞭解它。
composer require symfony/workflow
可以使用以下命令安裝 Workflow 元件。
Yaml
composer require symfony/yaml
Yaml 元件提供一個選項來解析 YAML 檔案格式並將其轉換為 PHP 陣列。它還可以從純 php 陣列寫入 YAML 檔案。可以使用以下命令安裝 Yaml 元件。
Ldap
composer require symfony/ldap
Ldap 元件提供 PHP 類來連線到 LDAP 或 Active Directory 伺服器並針對其對使用者進行身份驗證。它提供了一個連線到 Windows 域控制器的選項。可以使用以下命令安裝 Ldap 元件。
Debug
composer require symfony/debug
Debug 元件提供各種選項來啟用 PHP 環境中的除錯。通常,除錯 PHP 程式碼很困難,但除錯元件提供簡單的類來簡化除錯過程並使其乾淨且結構化。可以使用以下命令安裝 Debug 元件。
Stopwatch
use Symfony\Component\Stopwatch\Stopwatch;
$stopwatch = new Stopwatch();
$stopwatch->start('somename');
// our code to profile
$profiled_data = $stopwatch->stop('somename');
echo $profiled_data->getPeriods()
Stopwatch 元件提供 Stopwatch 類來分析我們的 PHP 程式碼。一個簡單的用法如下所示。
composer require symfony/stopwatch
可以使用以下命令安裝 Stopwatch 元件。
VarDumper
composer require symfony/var-dumper
VarDumper 元件提供了更好的 `dump()` 函式。只需包含 VarDumper 元件並使用 dump 函式即可獲得改進的功能。可以使用以下命令安裝 VarDumper 元件。
BrowserKit
composer require symfony/browser-kit
BrowserKit 元件提供了一個抽象瀏覽器客戶端介面。它可用於以程式設計方式測試 Web 應用程式。例如,它可以請求表單,輸入樣本資料並提交它以以程式設計方式查詢表單中的任何問題。可以使用以下命令安裝 BrowserKit 元件。
PHPUnit Bridge元件提供了許多改進 PHPUnit 測試環境的選項。可以使用以下命令安裝 PHPUnit Bridge 元件。
composer require symfony/phpunit-bridge
Asset(資源)
Asset 元件在 Web 應用程式中提供通用的資源處理。它生成 CSS、HTML、JavaScript 等資源的 URL,並執行版本維護。我們將在“檢視引擎”章節中詳細檢查 Asset 元件。可以使用以下命令安裝 Asset 元件。
composer require symfony/asset
CssSelector(CSS 選擇器)
CssSelector 元件提供了一個選項,可以將基於 CSS 的選擇器轉換為 XPath 表示式。Web 開發人員比 XPath 表示式更熟悉基於 CSS 的選擇器表示式,但是,在 HTML 和 XML 文件中查詢元素最有效的表示式是 **XPath 表示式**。
CssSelector 使開發人員能夠使用 *CSS 選擇器* 編寫表示式,但是,該元件會在執行之前將其轉換為 XPath 表示式。因此,開發人員可以兼顧 CSS 選擇器的簡潔性和 XPath 表示式的效率。
可以使用以下命令安裝 CssSelector 元件。
composer require symfony/css-selector
DomCrawler(DOM 爬蟲)
DomCrawler 元件提供了使用 DOM 概念在 HTML 和 XML 文件中查詢元素的各種選項。它還提供使用 XPath 表示式查詢元素的選項。DomCrawler 元件可以與 CssSelector 元件一起使用,以便使用 CSS 選擇器代替 XPath 表示式。可以使用以下命令安裝 DomCrawler 元件。
composer require symfony/dom-crawler
Form(表單)
Form 元件簡化了在 Web 應用程式中建立表單的過程。我們將在“表單”章節中詳細學習表單程式設計。可以使用以下命令安裝 Form 元件。
composer require symfony/form
HttpFoundation(HTTP 基礎)
HttpFoundation 元件為 HTTP 規範提供了一個面向物件的層。預設情況下,PHP 將 HTTP 請求和響應詳細資訊作為基於陣列的物件提供,例如 **$_GET、$_POST、$_FILES、$_SESSION** 等。可以使用簡單的舊函式 **setCookie()** 來執行基於 HTTP 的功能,例如設定 Cookie。HttpFoundation 在少量類(如 Request、Response、RedirectResponse 等)中提供了所有與 HTTP 相關的功能。我們將在後面的章節中學習這些類。
可以使用以下命令安裝 HttpFoundation 元件。
composer require symfony/http-foundation
HttpKernel(HTTP 核心)
HttpKernel 元件是 Symfony Web 設定的核心元件。它提供了 Web 應用程式所需的所有功能——從接收 **Request** 物件到傳送回 **Response** 物件。正如在 Symfony Web 框架的體系結構中所討論的,Symfony Web 應用程式的完整體系結構由 HttpKernel 提供。
可以使用以下命令安裝 HttpKernel 元件。
composer require symfony/http-kernel
Routing(路由)
Routing 元件將 HTTP 請求對映到一組預定義的配置變數。路由決定我們應用程式的哪個部分應該處理請求。我們將在“路由”章節中瞭解更多關於路由的資訊。
可以使用以下命令安裝 Routing 元件。
composer require symfony/filesystem
Templating(模板)
Templating 元件提供了構建高效模板系統所需的必要基礎結構。Symfony 使用 Templating 元件來實現其檢視引擎。我們將在“檢視引擎”章節中瞭解更多關於 Templating 元件的資訊。
可以使用以下命令安裝 Templating 元件。
composer require symfony/templating
Validator(驗證器)
Validator 元件提供了 **JSR-303 Bean Validation Specification** 的實現。它可以用來驗證 Web 環境中的表單。我們將在“驗證”章節中瞭解更多關於 Validator 的資訊。
可以使用以下命令安裝 Validator 元件。
composer require symfony/validator
Security(安全)
Security 元件為我們的 Web 應用程式提供了完整的安全系統,無論是 HTTP 基本身份驗證、HTTP Digest 身份驗證、基於互動表單的身份驗證、X.509 證書登入等。它還透過內建的 ACL 系統提供基於使用者角色的授權機制。我們將在“高階概念”章節中更詳細地學習。
可以使用以下命令安裝 Security 元件。
composer require symfony/security