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
廣告
© . All rights reserved.