对于刚接触 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 服务配置 看这一篇就够了的更多相关文章

  1. 【转】最新版zookeeper配置看这一篇就够了

    [From]https://blog.csdn.net/yydriver/article/details/81107954 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...

  2. Android studio 3.0安装与配置(看这一篇就够了)

    前言 为了完成数据库大作业,并充分利用学过的Java语言,决定开发一个简单完整成熟的安卓手机应用程序.于是下载安装Android Studio集成开发环境,第一次安装最新版本,因为墙的原因安装失败,第 ...

  3. [转帖]nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件

    nginx学习,看这一篇就够了:下载.安装.使用:正向代理.反向代理.负载均衡.常用命令和配置文件 2019-10-09 15:53:47 冯insist 阅读数 7285 文章标签: nginx学习 ...

  4. 什么是 DevOps?看这一篇就够了!

    本文作者:Daniel Hu 个人主页:https://www.danielhu.cn/ 目录 一.前因 二.记忆 三.他们说-- 3.1.Atlassian 回答"什么是 DevOps?& ...

  5. JVM内存模型你只要看这一篇就够了

    JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...

  6. 【java编程】ServiceLoader使用看这一篇就够了

    转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...

  7. 鸿蒙应用程序Ability(能力)看这一篇就够

    本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...

  8. 关于 Docker 镜像的操作,看完这篇就够啦 !(下)

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  9. Java中的多线程=你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

随机推荐

  1. 1-4CMYK色彩模式

    http://www.missyuan.com/thread-350717-1-1.html CMYK也称作印刷色彩模式,顾名思义就是用来印刷的. 只要是在印刷品上看到的图像,就是CMYK模式表现的 ...

  2. 第二章、URL与资源

    1 URL统一资源定位符 URL 是浏览器寻找信息时所需的资源位置.通过 URL,人类和应用程序才能找到.使用并共享因特网上大量的数据资源.URL是作为URI的一个子集,URI是一类更通用的资源标识符 ...

  3. JDK8 新特性 Lambda表达式

    1.java8中Lambda表达式基础语法: (x,y) -> {} 左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型: 中间是一个jd ...

  4. EEPROM与FLASH

    最初的ROM rom最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了prom,可以自己写入一次,要是写错了,只能换一片,自认倒霉. 人类文明不断进步,终于出现了可多次擦除写入的EPROM, ...

  5. 详解Intellij IDEA中.properties文件中文显示乱码问题的解决

    首先,你可能会见到如下提示: File encoding is disabled because .properties file (see Settings|Editor|File Encoding ...

  6. Flutter移动电商实战 --(35)列表页_上拉加载更多制作

    右侧列表上拉加载配合类别的切换 上拉加载需要一个page参数,当点击大类或者小类的时候,这个page就要变成1 provide内定义参数 首先我们需要定义一个page的变量 下图是我们之前在首页的时候 ...

  7. Sublime 添加∕删除右键菜单.bat

    Sublime 添加∕删除右键菜单.bat @ECHO OFF & PUSHD %~DP0 & TITLE >NUL 2>&1 REG.exe query &quo ...

  8. 使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转

    扩展IIS的两种方法:模块与处理程序. 模块,类似于以前的IIS版本中的ISAPI筛选器,它参与每个请求处理.IIS中一些现成的模块包括身份验证模块(用于处理请求的身份验证状态),压缩模块(用于压缩返 ...

  9. RotateDrawable

    用来对Drawable进行旋转,也是通过setLevel来控制旋转的,最大值也是:10000 相关属性如下: fromDegrees:起始的角度,,对应最低的level值,默认为0 toDegrees ...

  10. 关于ios在H5页面长按识别二维码无效

    环境 框架: vue 操作系统: ios 解决 如果你的vue-router用了mode:history: 把它去掉用默认的就OK了