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的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
随机推荐
- 如何在vue中使用svg
1.安装依赖 npm install svg-sprite-loader --save-dev 2.在config文件中配置 const path = require('path'); func ...
- C语言中内存对齐规则讨论(struct)
C语言中内存对齐规则讨论(struct) 对齐: 现代计算机中内存空间都是按着byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地 ...
- 字符串匹配 - hash
之前有写过一篇hash表,不过那是非常久远的时候了,应该是大一刚学一个学期的时候的成果,后来也就不那样写了,后来从xiaoxin那里学习了hash的写法,比较容易用也比较方便多hash,就这样. 分别 ...
- 以太坊 Geth 环境搭建(Ubuntu)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014409380/article/details/79897335 时隔多日,我又想起来更新博客, ...
- 如何用CSS3来实现卡片的翻转特效
CSS3实现翻转(Flip)效果 动画效果 效果分析 当鼠标滑过包含块时,元素整体翻转180度,以实现“正”“反”面的切换. HTML分析 分析:.container,.flip为了实现动画效果做准备 ...
- MyEclipse环境的项目改为在Eclipse中运行爬坑记【我】
新检出一个web项目,同事都是运行在MyEclipse中的,我用Eclipse启动, 1.首先是许多jar包报错: 处理方法为 remove掉,然后 选 WEB-INF 下的所有 jar 重新添加 ...
- Mysql5.6.45配置安装
##1.1简介 因为之前电脑比较卡,自己重装了个系统,麻烦的就是装一些编程软件,但是自己吃饭的家伙也要会装啊,为了以后更方便的安装,自己总结一下步骤,进入正题 ##1.2资源下载 官方网站链接: ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_18-页面静态化-模板管理-GridFS研究-取文件
需要创建mongoDB的配置类1 配置类里面主要创建.GridFSBucket这个对象.这个对象的作用就是用来打开一个下载流 在cms的微服务下,在config下创建MongoConfig.这个时候就 ...
- 利用redis 分布式锁 解决集群环境下多次定时任务执行
定时任务: @Scheduled(cron= "0 39 3 * * *") public void getAllUnSignData(){ //检查任务锁,若其它节点的相同定时任 ...
- 利用subst命令将一个文件夹镜像成本地的一个磁盘
企业里都是只有一个c盘,因为这样安全性好,性能也好 那么有时候,我们是需要其他的系统盘来做一些事情的,比如远程的时候需要带过去一个系统盘,这个时候,就可以用subset这个命令来解决这个问题. 叫镜像 ...