- Symfony 教程
- Symfony - 首页
- Symfony - 简介
- Symfony - 安装
- Symfony - 架构
- Symfony - 组件
- Symfony - 服务容器
- Symfony - 事件与事件监听器
- Symfony - 表达式
- Symfony - Bundles
- 创建简单的 Web 应用
- Symfony - 控制器
- Symfony - 路由
- Symfony - 视图引擎
- Symfony - Doctrine ORM
- Symfony - 表单
- Symfony - 验证
- Symfony - 文件上传
- Symfony - Ajax 控制
- Cookie 与会话管理
- Symfony - 国际化
- Symfony - 日志
- Symfony - 邮件管理
- Symfony - 单元测试
- Symfony - 高级概念
- Symfony - REST 版本
- Symfony - CMF 版本
- 完整的运行示例
- Symfony 有用资源
- Symfony - 快速指南
- Symfony - 有用资源
- Symfony - 讨论
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