1、Http Client
http client是Symfony提供的,可以包裹php流和curl的底层工具。
1、发送http request
$response = $client->request('GET', 'https://...', [ 'headers' => [ 'Accept' => 'application/json', ], ]);
2、认证
3、Query string parameter
4、定义发送http header
5、上传数据
6、发送cookies
7、重定向
8、重新发送失败的请求
9、http代理
10、处理响应
$response = $client->request('GET', 'https://...'); // gets the HTTP status code of the response $statusCode = $response->getStatusCode();
11、处理网络超时、错误等
12、限制请求的数目
。。。
2、Filesystem
提供与os无关的文件、目录的操作能力
3、ExpressionLanguage表达式语言
与eval相比较,ExpressionLanguage功能更加可控,保证不会执行危险的php语句。eval最好别用。ExpressionLanguage提供两种工作方式:
1、evaluation:表达式被评估,但是并不编译成php
2、compile:表达式被编译成php,因此可以被缓存和评估
3、parse和lint:解析和检查表达式
4、Lock锁
Symfony提供Lock的功能,负责对共享资源的排他性处理
`
$lock = $factory->createLock('pdf-creation');
if ($lock->acquire()) {
// The resource "pdf-creation" is locked.
// You can compute and generate the invoice safely here.
$lock->release();
}
`
5、Workflow 工作流
Symfony 的 Workflow 组件提供了一套完整的有限状态机(Finite State Machine)实现,用于管理对象的状态流转。 Symfony 原生只支持上述状态机和Workflow net。
1、Workflow:工作流是状态管理的最高层抽象,控制对象如何从一个状态转变到另一个状态
a、可以包含多个状态(Place)和转变(Transition)
b、支持两种类型:状态机(State Machine)和工作流网(Workflow Net)
c、可以附加事件监听器
2、State Machine (状态机)
Workflow 的一种类型,与Workflow的区别在于:状态机是单状态的,而工作流是多状态的。特点是:
a、任何时候对象只能处于一个状态(Place)
b、状态转变是明确的、离散的
c、适合建模有清晰状态边界的情况
比如,订单状态管理(新建、已支付、已发货等)。
3、Place (状态/位置)
对象可以处于的位置或状态。
a、在状态机中,一个对象同时只能在一个Place
b、在工作流网中,对象可以同时在多个Places
c、通常用字符串标识(如'draft'、'published')
4、Transition (转变)
从一个Place到另一个Place的转变规则:
a、名称(如'submit_for_review')
b、from: 起始Place(可以是数组)
c、to: 目标Place
d、guard: 可选的转变条件
5、Workflow Net(工作流网)
基于Petri网,支持多状态并行,比如合同审批的时候,需要法务部、财务部、技术部并行审批,在每个部门进行审批的时候,在每个部门里面,都有一个状态。
其他的工作流还包括:业务流程建模(BPMN)、有向无环图(DAG)、规则引擎驱动工作流等。
实际项目中,80%的业务场景用状态机就能满足,15%需要工作流网,只有约5%的超复杂流程需要专业工作流引擎解决方案。
6、UID / UUID
UUID时UID在软件行业最常用的方案。UUID有很多版本,从V1到V8,其中V7最被推荐使用。
$uuid = Uuid::v1();
7、PHP Polyfills
主要功能是在无法改变php运行环境的情况下,让旧版本PHP能够使用新版本PHP才有的函数和特性。
8、YAML Parser
YAML Parser将yaml格式的文件转换成php数组。
9、Webhook
简单来说,Webhook 是一种“反向 API”,是服务端主动向客户端发送消息的一种机制。
当事件发生的时候,增加一个RemoteEvent消费者,对进来的webhook进行处理,具体处理的webhook和路径,可以在config/packages/framework.yaml进行配置。
`
[AsRemoteEventConsumer('mailer_mailgun')]
class WebhookListener implements ConsumerInterface
{
public function consume(RemoteEvent $event): void
{
if ($event instanceof MailerDeliveryEvent) {
$this->handleMailDelivery($event);
} elseif ($event instanceof MailerEngagementEvent) {
$this->handleMailEngagement($event);
} else {
// This is not an email event
return;
}
}
...
`