Symfony - 组件


如前所述,Symfony 组件是提供特定功能的独立 PHP 库,可在任何 PHP 应用程序中使用。Symfony 的每个版本都引入了有用的新组件。目前,Symfony 框架中有 30 多个高质量组件。本章我们来学习一下Symfony组件的使用。

安装 Symfony 组件

使用composer命令可以轻松安装Symfony组件。以下通用命令可用于安装任何 Symfony 组件。

cd /path/to/project/dir 
composer require symfony/<component_name> 

让我们创建一个简单的 php 应用程序并尝试安装文件系统组件。

步骤 1 - 为应用程序创建一个文件夹,filesystem-example

cd /path/to/dev/folder 
mdkir filesystem-example 
cd filesystem-example 

步骤 2 - 使用以下命令安装文件系统组件。

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 组件。

composer require symfony/finder

安慰

控制台组件提供了各种选项来轻松创建可以在终端中执行的命令。Symfony 广泛使用Command组件来提供各种功能,例如创建新应用程序、创建捆绑包等。甚至可以使用 Symfony 命令、php bin/console server:run调用 Web 服务器中的 PHP 构建,如安装部分所示。可以使用以下命令安装控制台组件。

composer require symfony/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(); 
?> 

应用程序类设置了一个简单的控制台应用程序的必要功能。

步骤 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 { 
}

该应用程序使用命令组件中提供的以下四个类。

  • 命令- 用于创建新命令

  • InputInterface - 用于设置用户输入

  • InputArgument - 用于获取用户输入

  • OutputInterface - 用于将输出打印到控制台

步骤 5 - 创建一个函数configure()并设置名称、描述和帮助文本。

protected function configure() { 
   $this 
      ->setName('app:hello') 
      ->setDescription('Sample command, hello') 
      ->setHelp('This command is a sample command') 
} 

步骤 6 - 创建命令的输入参数、用户并将其设置为强制。

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 组件提供PSR-0PSR-4类加载器标准的实现。它可用于自动加载类。近期会贬值。基于 Composer 的类加载器优于此组件。可以使用以下命令安装 ClassLoader 组件。

composer require symfony/class-loader

财产访问

PropertyAccess 组件提供了各种选项来使用字符串表示法读取和写入对象和数组详细信息。例如,可以使用[price]字符串动态访问具有关键价格的数组Product

$product = array( 
   'name' => 'Cake' 
   'price' => 10 
);  
var priceObj = $propertyAccesserObj->getValue($product, '[price]');

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

composer require symfony/property-access 

房产信息

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 组件提供了 PHP 中基于事件的编程。它使对象能够通过分派事件并侦听事件来相互通信。我们将在事件和事件监听器章节中学习如何创建事件并监听它们。

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

composer require symfony/event-dispatcher

依赖注入

DependencyInjection 组件提供了一种简单有效的机制来创建具有依赖项的对象。当项目增长时,它会出现许多具有深度依赖关系的类,需要正确处理。否则,项目就会失败。DependencyInjection 提供了一个简单而强大的容器来处理依赖关系。我们将在服务容器章节中了解容器和依赖注入概念。

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

composer require symfony/dependency-injection

串行器

Serializer 组件提供了一个选项,可以将 PHP 对象转换为特定格式(例如 XML、JSON、Binary 等),然后允许将其转换回原始对象,而不会丢失任何数据。

可以使用以下命令安装序列化器组件。

composer require symfony/serializer

配置

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

composer require symfony/config

表达语言

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

composer require symfony/expression-language

选项解析器

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 组件提供了各种选项来解析 .env 文件以及其中定义的变量,以便可以通过getenv()、 $_ENV$_SERVER访问。可以使用以下命令安装 Dotenv 组件。

composer require symfony/dotenv

缓存

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

composer require symfony/cache 

国际

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

composer require symfony/intl

翻译

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

composer require symfony/translation

工作流程

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

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

composer require symfony/workflow 

亚米尔

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

composer require symfony/yaml

LDAP

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

composer require symfony/ldap

调试

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

composer require symfony/debug

跑表

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

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

// our code to profile 
$profiled_data = $stopwatch->stop('somename');  
echo $profiled_data->getPeriods()

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

composer require symfony/stopwatch

变量转储器

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

composer require symfony/var-dumper

浏览器工具包

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

composer require symfony/browser-kit

PHPUnit桥

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

composer require symfony/phpunit-bridge

资产

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

composer require symfony/asset

CSS选择器

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

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

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

composer require symfony/css-selector

多姆·克劳勒

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

composer require symfony/dom-crawler

形式

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

composer require symfony/form

Http基金会

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

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

composer require symfony/http-foundation

Http内核

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

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

composer require symfony/http-kernel

路由

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

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

composer require symfony/filesystem

模板化

模板组件提供了构建高效模板系统所需的基础设施。Symfony 使用模板组件来实现其视图引擎。我们将在视图引擎章节中了解有关模板组件的更多信息。

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

composer require symfony/templating

验证器

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

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

composer require symfony/validator

安全

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

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

composer require symfony/security