Symfony 服务配置 看这一篇就够了
对于刚接触 Symfony 的新手来说,如何配置服务是一件很困难的事情。虽然在 Symfony 的新版本的框架中加入了自动加载(autowire),基本上满足了一般的需求,但是如果你想深入了解“服务”这个概念,并且能够娴熟的使用,就需要能够手动配置完整的工程级别的服务配置。
可惜,对于服务的诸多配置官方文档上的介绍是分功能来描述的,并没有一个列表性质的总结。网上有一些但是也不够全面。
本文总结了大部分的服务配置以及语法,相信能够满足大规模项目中的99%配置需求。
本文没有对 tag,decorates 配置进行介绍,后续的文章会补上,感兴趣的同学可以关注我的博客。
如何阅读本文,
如何阅读本文,
如何阅读本文,
重要的事情说了三遍了,如果你有服务配置的基础,而只是对某个配置不太了解的话,大可以直接从下面的配置中查看(像手册一样)。如果你是新手小白,那么请注意阅读方法:文章分两部分,一部分是服务配置 yaml 格式的文件,后续会补上 xml 以及 PHP 的版本,xml 格式比较严谨(大部分的官方 bundle 采用的都是 xml),而 PHP 代码实现则可以对配置内部如何实现有比较直观清晰的认识。另一部分是服务对应的 PHP 代码,几个简单的类而已。
# config/service.yaml parameters:
email_address: admin@email.com services:
# 使用 FQCN 的形式定义一个服务名(推荐)
App\Services\Email:
# 服务实现的类
class: App\Services\Email
# true 则可以通过 get(\App\Services\Email::class) 方法获取到,false 不可以
public: true
# 当该服务在多个地方被注入或获取时,返回不同的实例,如果是 true 则返回同一个实例
shared: false
# 关闭 autowire
autowire: false
# 这个服务(类)的构造方法需要3个参数,第一个参数引用了一个 parameter,第二个参数是一个固定值,
# 第三个参数引用了一个服务,第四个
# 参数是一个可选的服务,存在就引用,不存在就使用服务(类)中的默认值(请查看 App\Services\Email 的构造方法)
# %xxx% 表示引用一个 parameters 中定义的变量,@xxx 表示引用一个服务
arguments: ["%email_address%", 10, "@app.logger", '@?app.not_exist'] # 等价于下面的设置
# arguments:
# - "%email_address%"
# - 10
# - "@app.logger"
# - '@?app.not_exist'
# 这里需要注意 "" 和 '' 的使用,如果引用的服务名是 FQCN 那么必须使用 '',
# 如果是普通的字符串服务名那么双引单引都可以
# 等价于上一行,因为在下面关联了这个接口和服务
# arguments: ["%email_address%", 10, '@App\Services\LoggerInterface']
# 这个服务(类)有一个 server 属性,对这个属性进行赋值操作,赋值了一个数组
properties:
server:
smtp: smtp.email.com
imap: imap.email.com
# 这个服务(类)有一个 setTemplate 方法,该方法有两个参数,服务被注入或获取时,会自动调用该方法
calls:
- ['setTemplate', ['@app.template', 512]] #等价于下面的设置
# - method: setTemplate
# arguments:
# - '@app.template'
# - 512 App\Services\Logger:
class: App\Services\Logger
public: true
shared: false # 这里的设置没起作用,不知道为什么
# 给 App\Services\Logger 服务定义一个别名
# 但是不能够通过 get('app.logger') 获取服务,因为没有指定 public,
# 那么在 ResolvePrivatesPass 中就会将 public 设置为 false
app.logger:
alias: App\Services\Logger # 关联接口和服务,任何一个服务如果注入的是参数类型是 App\Services\LoggerInterface,
# 那么都将获取到 App\Services\Logger 这个服务
App\Services\LoggerInterface: '@App\Services\Logger' # 使用字符串的形式定义一个服务名(不推荐),app.template 中的 "." 没有任何意义,好看而已
app.template:
class: App\Services\Template
# 这个服务(类)的初始化是由 factory 中设置的方法来实现的,也就是说当这个服务被注入或获取时,会静态调用 App\Services\TemplateFactory
# 中的 createTemplate 这个方法
# 下面的语法只适用于静态方法的创建
factory:
['App\Services\TemplateFactory', createTemplate]
# 这个静态方法需要一个参数
arguments:
- 512 # 如果工厂类需要实例化,那么就必须将其定义为一个服务
# App\Services\TemplateFactory: ~
# app.template:
# class: App\Services\Template
# # 这个 createTemplate 是成员方法,下面的语法只适用于工厂类实例化后调用成员方法的创建
# factory:
# 'App\Services\TemplateFactory:createTemplate'
# arguments:
# - 512 ############################## 自动装载 autowire ############################################################
# 如果当前的 services 下面没有定义 _default(或者 _default 下面定义的 autowire:false) 并且 App\Services\TestAutowire\TestAutowire
# 这个服务中也没有定义 autowire,那么默认 autowire 就是 false。autowire:false 意味着如果服务的构造方法中需要参数,则必须手动的在
# arguments 字段中明确的设置。
# 也就是说所谓的 autowire 就是自动注入构造方法中所需要的参数而无须手动声明。
App\Services\TestAutowire\TestAutowire:
class: App\Services\TestAutowire\TestAutowire
public: true
arguments:
- '@App\Services\TestAutowire\TestAutowireArg'
App\Services\TestAutowire\TestAutowireArg:
class: App\Services\TestAutowire\TestAutowireArg # 设置了 autowire:true 则无需手动设置构造方法的参数了
# App\Services\TestAutowire\TestAutowire:
# class: App\Services\TestAutowire\TestAutowire
# public: true
# autowire: true
# App\Services\TestAutowire\TestAutowireArg:
# class: App\Services\TestAutowire\TestAutowireArg ############################## 父服务与子服务 ############################################################
App\Services\ParentAndChild\ParentService:
class: App\Services\ParentAndChild\ParentService
public: true
abstract: true
arguments:
$someService1: '@App\Services\ParentAndChild\SomeService1'
$someService2: '@App\Services\ParentAndChild\SomeService2'
App\Services\ParentAndChild\ChildService:
class: App\Services\ParentAndChild\ChildService
parent: App\Services\ParentAndChild\ParentService
public: true
# 波浪线表示 null,容器会使用默认的设置,不能通过 get() 获取,因为默认 public:false
App\Services\ParentAndChild\SomeService1: ~
App\Services\ParentAndChild\SomeService2: ~
Symfony 服务配置 看这一篇就够了的更多相关文章
- 【转】最新版zookeeper配置看这一篇就够了
[From]https://blog.csdn.net/yydriver/article/details/81107954 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...
- Android studio 3.0安装与配置(看这一篇就够了)
前言 为了完成数据库大作业,并充分利用学过的Java语言,决定开发一个简单完整成熟的安卓手机应用程序.于是下载安装Android Studio集成开发环境,第一次安装最新版本,因为墙的原因安装失败,第 ...
- [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...
- 什么是 DevOps?看这一篇就够了!
本文作者:Daniel Hu 个人主页:https://www.danielhu.cn/ 目录 一.前因 二.记忆 三.他们说-- 3.1.Atlassian 回答"什么是 DevOps?& ...
- JVM内存模型你只要看这一篇就够了
JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...
- 【java编程】ServiceLoader使用看这一篇就够了
转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...
- 鸿蒙应用程序Ability(能力)看这一篇就够
本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(下)
紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...
- Java中的多线程=你只要看这一篇就够了
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
随机推荐
- Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config
目录 Spring Cloud Config(一):聊聊分布式配置中心 Spring Cloud Config Spring Cloud Config(二):基于Git搭建配置中心 Spring Cl ...
- Flutter移动电商实战 --(30)列表页_商品列表UI界面布局
小程序里面的布局方式 小程序的图片上这里使用的是warp布局,因为首页里面火爆专区,已经用过了warp来布局了. 所以这里我们没有必要再讲一遍,这里我们使用ListView,我们把它布局成下图这种形式 ...
- win10设置开机开启数字锁定
windows10开机小键盘默认关闭,网上查询修改InitialKeyboardIndicators键值为2,或者80000002,经过实际测试,均无效,键值8000000002有效,是中间8个0,开 ...
- 模糊C均值聚类-FCM算法
FCM(fuzzy c-means) 模糊c均值聚类融合了模糊理论的精髓.相较于k-means的硬聚类,模糊c提供了更加灵活的聚类结果.因为大部分情况下,数据集中的对象不能划分成为明显分离的簇,指派一 ...
- OpenCV3.4.1快速集成到Android studio中,10分钟搞定
OpenCV3.4.1快速集成到Android studio中,10分钟搞定 转载 https://blog.csdn.net/yu540135101/article/details/8259 ...
- Tornado实现监控数据实时展示
前言: It has been a while since I last updated my blogs. 使用Tornado开发一个实时监控信息系统,其中包括 CUP.内存.网卡.磁盘使用率. 涉 ...
- Python在for循环中更改list值的方法
一.在for循环中直接更改列表中元素的值不会起作用: 如: l = list(range(10)[::2]) print (l) for n in l: n = 0 print (l) 运行结果: [ ...
- exactly the kind of division of tasks that Gulp.js is built on
The results are then passed to a reporter function that displays the results of the code analysis in ...
- fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题
fastjson在将Map<Integer, String>转换成JSON字符串时,出现中文乱码问题. 先记下这个坑,改天在看看是怎么导致的,暂时通过避免使用Integer作为键(使用St ...
- 安装Oracle11g出现INS-13001环境不满足最低要求
原版:https://blog.csdn.net/Q_Sea__/article/details/79012808 第一次安装Oracle11g,就出现这个问题,就找了一些解决方案.现在总结一下. 出 ...