对于刚接触 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. python-selenium视频教程分享

    1.python电子书 2.课件 3.前段调试工具 4.文档资料 5.python-selenium课程列表 6.sele01-sele22 百度网盘连接:链接: https://pan.baidu. ...

  2. Django基础之中间件的执行流程

    当请求到达中间件以后,先按照正序执行每个注册中间件的process_request方法,process_request方法返回的值是None,就依次执行. 如果返回的值是HttpResponse对象, ...

  3. redhat7.4安装gitlab

    1.参考官方安装指南 https://about.gitlab.com/install/#centos-7 2.遇到的问题 2.1.启动postfix出错 错误内容 Job for postfix.s ...

  4. Contest Hunter 3101

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

  5. 将elasticsearch设置为windows系统服务

    目前我都是在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch 这样直接启动的话集 ...

  6. go区分操作系统

    package main import ( "fmt" "runtime" ) func main() { fmt.Println("Go runs ...

  7. 从Maven中央仓库下载jar包

    1. Maven中央仓库 Maven中央仓库存放着比较新版本比较全的 jar 包 仓库网址:https://mvnrepository.com/ 2. 使用Maven中央仓库的 jar 包 (1) 在 ...

  8. python selenium 的配置安装

    selenium的使用需要以下几个配置步骤. (1) 首先安装selenium,使用python自带的pip进行安装.若pip配置到系统环境变量,可以直接在cmd命令行中使用,若没有配置到到环境变量, ...

  9. js获取本地ip

    function getUserIP(onNewIP) { // onNewIp - your listener function for new IPs //compatibility for fi ...

  10. 组件基础之动态tab组件

    <template> <div id="demo31"> <p>-----------------组件基础之动态tab组件一---------- ...