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 提供的组件范围广泛,从简单功能(例如文件系统)到高级功能(例如事件、容器技术和依赖注入)。在以下部分中,让我们逐一了解所有组件。

文件系统

文件系统组件提供与文件和目录相关的基本系统命令,例如文件创建、文件夹创建、文件存在等。可以使用以下命令安装文件系统组件。

composer require symfony/filesystem

Finder

Finder 组件提供流畅的类来查找指定路径中的文件和目录。它提供了一种简单的方法来迭代路径中的文件。可以使用以下命令安装 Finder 组件。

composer require symfony/finder

控制台

控制台组件提供各种选项来轻松创建可以在终端中执行的命令。 Symfony 广泛使用 Command 组件来提供各种功能,例如创建新应用程序、创建包等。甚至可以使用 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 − 创建一个名为 HelloCommand 的类,并扩展 main.php 中的 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 − 创建一个函数 execute(),其中包含两个参数 InputArgumentOutputArgument

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 的预构建二进制文件,可用于调用应用程序中的命令。

进程

进程组件提供以安全高效的方式在子进程中运行任何系统命令的选项。可以使用以下命令安装进程组件。

composer require symfony/process

ClassLoader

ClassLoader 组件为 PSR-0PSR-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、二进制等,然后允许它将其转换回原始对象而不会丢失任何数据。

可以使用以下命令安装 Serializer 组件。

composer require symfony/serializer

Config

Config 组件提供了加载、解析、读取和验证 XML、YAML、PHP 和 ini 类型配置的选项。它还提供了各种选项来从数据库加载配置详细信息。这是以清晰简洁的方式配置 Web 应用程序的重要组件之一。可以使用以下命令安装配置组件。

composer require symfony/config

ExpressionLanguage

ExpessionLanguage 组件提供了一个成熟的表达式引擎。表达式是一行代码,旨在返回一个值。表达式引擎可以轻松编译、解析和获取表达式的值。它允许非 PHP 程序员(例如系统管理员)在配置环境(文件)中使用一个或多个表达式。 ExpressionLanguage 组件可以使用以下命令安装。

composer require symfony/expression-language

OptionsResolver

OptionsResolver 组件提供了一种方法来验证我们系统中使用的选项系统。例如,数据库设置放在一个数组 dboption 中,以主机、用户名、密码等作为键。在使用它连接到数据库之前,您需要验证条目。OptionsResolver 通过提供一个简单的类 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 组件。

composer require symfony/options-resolver

Dotenv

Dotenv 组件提供各种选项来解析 .env 文件,并使其中定义的变量可通过 getenv()、$_ENV$_SERVER 访问。可以使用以下命令安装 Dotenv 组件。

composer require symfony/dotenv

Cache

Cache 组件提供了扩展的 PSR-6 实现。它可用于向我们的 Web 应用程序添加缓存功能。由于它遵循 PSR-6,因此很容易上手,并且可以轻松地代替另一个基于 PSR-6 的缓存组件使用。可以使用以下命令安装缓存组件。

composer require symfony/cache

Intl

Intl 组件是 C Intl 扩展的替换库。可以使用以下命令安装 Intl 组件。

composer require symfony/intl

翻译

翻译组件提供了各种选项来使我们的应用程序国际化。通常,不同语言的翻译详细信息将存储在一个文件中,每种语言一个文件,并在应用程序运行时动态加载。有不同的格式来编写翻译文件。翻译组件提供了各种选项来加载任何类型的格式,例如纯 PHP 文件、CSV、ini、Json、Yaml、ICU 资源文件等。可以使用以下命令安装翻译组件。

composer require symfony/translation

Workflow

Workflow 组件提供了处理有限状态机的高级工具。通过以简单且面向对象的方式提供此功能,Workflow 组件可以相对轻松地在 PHP 中进行高级编程。我们将在高级概念章节中详细了解它。

可以使用以下命令安装工作流组件。

composer require symfony/workflow 

Yaml

Yaml 组件提供了一个选项,用于解析 YAML 文件格式并将其转换为 PHP 数组。它还能够从纯 php 数组写入 YAML 文件。可以使用以下命令安装 Yaml 组件。

composer require symfony/yaml

Ldap

Ldap 组件提供 PHP 类来连接到 LDAP 或 Active Directory 服务器并根据该服务器对用户进行身份验证。它提供了一个选项来连接到 Windows 域控制器。可以使用以下命令安装 Ldap 组件。

composer require symfony/ldap

Debug

Debug 组件提供了各种选项以在 PHP 环境中启用调试。通常,调试 PHP 代码很难,但调试组件提供了简单的类来简化调试过程并使其干净且结构化。可以使用以下命令安装调试组件。

composer require symfony/debug

Stopwatch

Stopwatch 组件提供了 Stopwatch 类来分析我们的 PHP 代码。简单的用法如下。

use Symfony\Component\Stopwatch\Stopwatch; 
$stopwatch = new Stopwatch(); 
$stopwatch->start('somename');  

// 我们要分析的代码
$profiled_data = $stopwatch->stop('somename');
echo $profiled_data->getPeriods()

可以使用以下命令安装 Stopwatch 组件。

composer require symfony/stopwatch

VarDumper

VarDumper 组件提供了更好的 dump() 函数。只需包含 VarDumper 组件并使用 dump 函数即可获得改进的功能。可以使用以下命令安装 VarDumper 组件。

composer require symfony/var-dumper

BrowserKit

BrowserKit 组件提供了一个抽象的浏览器客户端接口。它可用于以编程方式测试 Web 应用程序。例如,它可以请求表单,输入示例数据并提交,以便以编程方式查找表单中的任何问题。可以使用以下命令安装 BrowserKit 组件。

composer require symfony/browser-kit

PHPUnit Bridge

PHPUnit Bridge 组件提供了许多选项来改善 PHPUnit 测试环境。可以使用以下命令安装 PHPUnit Bridge 组件。

composer require symfony/phpunit-bridge

Asset

Asset 组件在 Web 应用程序中提供通用资产处理。它为 CSS、HTML、JavaScript 等资产生成 URL,并执行版本维护。我们将在 View Engine 章节中详细检查资产组件。可以使用以下命令安装 Asset 组件。

composer require symfony/asset

CssSelector

CssSelector 组件提供了将基于 CSS 的选择器转换为 XPath 表达式的选项。Web 开发人员比 XPath 表达式更了解基于 CSS 的选择器表达式,但在 HTML 和 XML 文档中查找元素的最有效表达式是 XPath 表达式

CssSelector 使开发人员能够在 CSS 选择器 中编写表达式,但是,组件在执行之前会将其转换为 XPath 表达式。因此,开发人员具有 CSS 选择器的简单性和 XPath 表达式的效率的优势。

可以使用以下命令安装 CssSelector 组件。

composer require symfony/css-selector

DomCrawler

DomCrawler 组件提供了各种选项,可使用 DOM 概念在 HTML 和 XML 文档中查找元素。它还提供了使用 XPath 表达式查找元素的选项。DomCrawler 组件可与 CssSelector 组件一起使用,以使用 CSS 选择器代替 XPath 表达式。可以使用以下命令安装 DomCrawler 组件。

composer require symfony/dom-crawler

Form

Form 组件可轻松在 Web 应用程序中创建表单。我们将在 Form 章节中详细学习表单编程。可以使用以下命令安装 Form 组件。

composer require symfony/form

HttpFoundation

HttpFoundation 组件为 HTTP 规范提供了一个面向对象的层。默认情况下,PHP 以基于数组的对象形式提供 HTTP 请求和响应详细信息,例如 $_GET、$_POST、$_FILES、$_SESSION 等。可以使用简单、朴素的旧函数 setCookie() 来实现基于 HTTP 的功能(例如设置 cookie)。HttpFoundation 在 Request、Response、RedirectResponse 等一小组类中提供了所有与 HTTP 相关的功能,我们将在后面的章节中了解这些类。

可以使用以下命令安装 HttpFoundation 组件。

composer require symfony/http-foundation

HttpKernel

HttpKernel 组件是 Symfony Web 设置中的核心组件。它提供了 Web 应用程序所需的所有功能 - 从接收 Request 对象到发回 Response 对象。 Symfony Web 应用程序的完整架构由 HttpKernel 提供,如 Symfony Web 框架的架构中所述。

可以使用以下命令安装 HttpKernel 组件。

composer require symfony/http-kernel

路由

路由组件将 HTTP 请求映射到一组预定义的配置变量。路由决定我们应用程序的哪个部分应该处理请求。我们将在路由章节中了解有关路由的更多信息。

可以使用以下命令安装路由组件。

composer require symfony/filesystem

templating

templating 模板组件提供了构建高效模板系统所需的基础架构。Symfony 使用模板组件来实现其视图引擎。我们将在视图引擎章节中详细了解模板组件。

可以使用以下命令安装模板组件。

composer require symfony/templating

validator

validator 验证器组件提供了 JSR-303 Bean 验证规范 的实现。它可用于在 Web 环境中验证表单。我们将在验证章节中学习更多关于验证器的知识。

可以使用以下命令安装验证器组件。

composer require symfony/validator

security

security 安全组件为我们的 Web 应用程序提供了完整的安全系统,包括 HTTP 基本身份验证、HTTP 摘要身份验证、基于交互式表单的身份验证、X.509 认证登录等。它还通过内置 ACL 系统提供基于用户角色的授权机制。我们将在高级概念章节中详细了解。

可以使用以下命令安装安全组件。

composer require symfony/security