Symfony组件


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

安装Symfony组件

Symfony组件可以使用composer命令轻松安装。以下通用命令可用于安装任何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步 - 使用以下命令安装文件系统组件。

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 来调用Web服务器中的PHP构建 如安装部分所示运行。所述 控制台 组件可以使用下面的命令被安装。

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();
?>

应用程序 类设置了裸机控制台应用程序的必要功能。

第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 组件中的以下四个类。

  • 命令 - 用于创建新命令

  • 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步 - 用两个参数 InputArgumentOutputArgument 创建一个函数 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 的预构建二进制文件,可用于调用应用程序中的命令。

处理

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

composer require symfony/process

类加载器

ClassLoader组件为 PSR-0PSR-4 类加载器标准提供了实现。它可以用来自动加载类。它将在不久的将来贬值。优先于此组件的基于Composer的类加载器。ClassLoader组件可以使用以下命令进行安装。

composer require symfony/class-loader

PropertyAccess

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

$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组件在PHP中提供基于事件的编程。它通过调度事件并收听事件来使对象彼此通信。我们将学习如何在事件和事件监听器章节中创建事件并收听它们。

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

composer require symfony/event-dispatcher

DependencyInjection

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

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

composer require symfony/dependency-injection

串行

串行器组件提供了将PHP对象转换为特定格式(如XML,JSON,Binary等)的选项,然后允许它将其转换回原始对象而不会丢失任何数据。

串行器组件可以使用以下命令进行安装。

composer require symfony/serializer

配置

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

composer require symfony/config

表达式语言

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

高速缓存

缓存组件提供了一个扩展的 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

工作流程

工作流组件提供了用于处理有限状态机的高级工具。通过以简单且面向对象的方式提供此功能,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

调试

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

composer require symfony/debug

跑表

秒表组件提供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

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

composer require symfony/var-dumper

BrowserKit

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章节中详细检查资产组件。资产组件可以使用以下命令进行安装。

composer require symfony/asset

CssSelector

CssSelector组件提供了一个将基于CSS的选择器转换为XPath表达式的选项。Web开发人员比XPath表达式更了解基于CSS的Selectors表达式,但在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

形成

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

composer require symfony/form

HttpFoundation

HttpFoundation组件为HTTP规范提供了一个面向对象的层。默认情况下,PHP提供HTTP请求和响应细节,如基于数组的对象,如 $ _GET,$ _POST,$ _FILES,$ _SESSION 等。基于HTTP的功能(如设置cookie)可以使用简单的普通旧函数 setCookie ) 。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

模板

模板组件为构建高效的模板系统提供了必要的基础架构。Symfony将Templating组件用于View引擎实现。我们将在View引擎章节中了解更多关于模板组件的内容。

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

composer require symfony/templating

验证器

Validator组件提供了 JSR-303 Bean验证规范的实现 。它可以用来在Web环境中验证表单。我们将在Validation章节中详细了解Validator。

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

composer require symfony/validator

安全

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

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

composer require symfony/security