对于刚接触 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. Contest Hunter 3101

    题目 Contest Hunter 3101 阶乘分解 原题传送门 题目分析 这里介绍一个本蒟蒻自己\(yy\)出来的方法. 我们发现,对于某一个单个的整数\(n\),若\(n\)能被某一个数\(x\ ...

  2. 5.3.3 自定义writable和RawComparatorWritable

    5.3.3 自定义writable (1)构造员工writable Hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很多事情,但是如果你想构造一些更加复杂的结果,你 ...

  3. spring boot定时任务

    介绍 该demo是基于注解(@Scheduled)以及多线程执行的定时任务. 步骤 启用异步执行 springboot实现异步调用 入口类添加启动注解 @EnableScheduling @Enabl ...

  4. 定位ScheduledExecutorService过了一段时间不执行问题

    今天查看生产环境的sentinel控制台,发现某dubbo应用一共5个节点,有3个失联了. 查看失联节点的应用日志,服务没有挂,各dubbo接口的日志正常在打印. 在应用节点ping/telnet s ...

  5. 移动端——页面点击( touchend -> click)

    手机端页面好多要注意的,点击事件就是其中一个: 在手机端页面中使用 click,安卓手机能正常实现点击效果,可是苹果手机不能点击:用 touchend 代替 click,苹果手机中能点击,但是可能出现 ...

  6. python hasattr()函数,getattr()函数, setattr()函数

    1. hasattr(object, ‘属性名 or 方法名') 判断一个对象里面是否有某个属性或者某个方法,返回布尔值,有某个属性或者方法返回True, 否则返回False 2. getattr() ...

  7. java dom4j 解析xml使用实践

    参考:https://dom4j.github.io/ http://www.cnblogs.com/liuling/archive/2013/02/05/dom4jxml.html 常用api: 1 ...

  8. kvm管理工具Webvirtmgr安装

    虚拟机版本vmware workstation 15.5.0 pro   (也就是linux版) cat /etc/redhat-release CentOS Linux release 7.4.17 ...

  9. c# 线程异步处理

    public class AsyncHelper { private static readonly TaskFactory _myTaskFactory = new TaskFactory(Canc ...

  10. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_10-修改页面-前端-修改页面

    1.进入页面,通过钩子方法请求服务端获取页面信息,并赋值给数据模型对象 2.页面信息通过数据绑定在表单显示 3.用户修改信息点击“提交”请求服务端修改页面信息接口 3.3.3 修改页面 3.3.3.1 ...