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
广告