Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
将值对象注入到自动装配的 Symfony 服务中_创想鸟

将值对象注入到自动装配的 Symfony 服务中

将值对象注入到自动装配的 symfony 服务中

与我的团队一起开发 symfony 项目时,我需要将特定的值对象实例注入到我的一项服务中。在这种特殊情况下,值本身需要根据 .env 文件中提供的值进行设置。

当然,我可以直接将字符串值传递到我的服务中,并让服务在构造函数中实例化值对象,但我想看看是否可以在 services.yaml 文件中配置它并注入完整的- 实例化对象代替。这将允许我将这些对象实例传递给多个服务,而不必在每个服务中重复创建值对象。

这是我的做法…

背景

我们的应用程序使用 twilio sdk。我们有各种封装 sdk 调用的服务,它们需要使用我们特定于环境的配置值(我们公司针对每个环境的 api 密钥等)。

twilio api 使用字符串标识符或 sid。每种类型的 sid 都有一个不同的 2 个字母前缀,后跟由数字 0 到 9 和字母 a 到 f(大写和小写)组成的 32 个字符。

例如:

conferencesid 具有前缀 cf,看起来像 cfabcdef0123456789abcdef0123456789callsid 具有前缀 ca,看起来像 caabcdef0123456789abcdef0123456789还有其他类型的sid,它们都使用相同的格式,仅通过前缀来区分

我想确保每个 sid 类型的值对象都验证传入的值具有该 sid 类型的正确前缀,同时确保字符串的长度正确并且仅由允许的字符组成。

值对象

我的每个 sid 类型都使用相同的验证逻辑和功能,仅通过 sid 类型的前缀进行区分,因此创建基本 trait 是有意义的。如果您愿意,这可以是一个抽象类。我不需要应用程序中的 twiliostringidentifier 概念作为参数类型或类似的东西,所以我在这里更喜欢 trait 而不是 abstract class。

此 trait 确实定义了每个 sid 类型必须实现的抽象方法 getprefixforsidtype(),为该给定类型提供正确的前缀。它还执行验证逻辑。

namespace appdomainmodeltwiliosid;use assertassert;trait twiliostringidentifier{    private readonly string $sid;    abstract private function getprefixforsidtype(): string;    public static function fromstring(string $string): self    {        return new self($string);    }    public function __construct(string $sid)    {        assert::that($sid)            ->startswith($this->getprefixforsidtype())            ->length(34)            ->regex('/^[a-za-z]{2}[0-9a-fa-f]{32}$/')        ;        $this->sid = $sid;    }    public function asstring(): string    {        return $this->sid;    }}    

sid 类

代表每种 sid 类型的值对象类都很简单。他们只需要使用 twiliostringidentifier trait 并通过 getprefixforsidtype() 方法定义正确的前缀。

namespace appdomainmodeltwiliosid;final readonly class accountsid{    use twiliostringidentifier;    private function getprefixforsidtype(): string    {        return 'ac';    }}

其他 sid 类型类除了定义的前缀之外都是相同的。

注入实例化对象

因为这些值对象将在整个应用程序中使用并与各种相关的值一起使用,而不仅仅是我们公司的全局值,所以我需要一种方法将特定类型的对象注入到服务中,该对象已经使用我们的.env 文件

我知道 symfony 能够定义通过工厂实例化的服务,但从未真正见过(我记得)任何关于注入一个对象的内容,该对象是从其他地方调用方法的结果。我还知道这些工厂方法可以将参数传递给它们,我只是不确定如何使用一个值对象实例来执行此操作。

定义特定值对象实例

symfony 的服务定义允许您命名每个服务。通常它是通过服务类的名称完成的:

apppathtomyservice:    class: apppathtomyservice    arguments: []

但是,该服务名称不必与类名称匹配。它可以是 app.my_service 或 foobarbazservice 或其他。

那么,如果我创建一个具有唯一名称的服务,该名称是我需要的值对象的实例化实例,该怎么办?我可以将 .env 值作为参数传递,然后将该对象实例注入到我的服务类中!

服务.yaml

# create services named with a global "namespace"globaltwiliosidaccount:    factory: ['appdomainmodeltwiliosidaccountsid', 'fromstring']    arguments: ['%env(twilio_account_sid)%']globaltwiliosidapi:    factory: ['appdomainmodeltwiliosidapisid', 'fromstring']    arguments: ['%env(twilio_api_sid)%']globaltwiliosidapplication:    factory: ['appdomainmodeltwiliosidapplicationsid', 'fromstring']    arguments: ['%env(twilio_app_sid)%']

然后通过它们的命名参数将这些服务(对象)传递到我的 twilio 服务中:

appservicevendortwiliotwilioservice:    arguments:        $accountsid: '@globaltwiliosidaccount'        $apisid: '@globaltwiliosidapi'        $applicationsid: '@globaltwiliosidapplication'        $apisecret: '%env(twilio_api_secret)%'

现在我的服务类可以接收完全实例化的值对象实例:

twilio服务

namespace AppServiceVendorTwilio;use AppDomainModelTwilioSidAccountSid;use AppDomainModelTwilioSidApiSid;use AppDomainModelTwilioSidApplicationSid;final readonly class TwilioService{    public function __construct(        private AccountSid $accountSid,        private ApiSid $apiSid,        private ApplicationSid $applicationSid,        private string $apiSecret    ) {}}

瞧!

symfony 足够灵活且足够直观,很容易弄清楚如何做到这一点。由于我在其他地方找不到执行此操作的快速参考,因此我想我应该将其写下来作为未来我和其他可能需要执行类似操作的人的参考

干杯,祝编码愉快!

以上就是将值对象注入到自动装配的 Symfony 服务中的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1318738.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
特定PHP框架(如Laravel、Symfony)的扩展机制
上一篇 2025年12月12日 03:29:18
PHP 框架性能优化中的并发处理优化
下一篇 2025年12月12日 03:29:32

相关推荐

  • 构建智能能源系统的关键:WebMan技术

    构建智能能源系统的关键:WebMan技术 摘要:随着智能能源系统的迅速发展,WebMan技术成为了构建智能能源系统关键的一环。本文将介绍WebMan技术的概念和工作原理,并提供了代码示例以帮助读者更好地理解和应用这一关键技术。 一、引言智能能源系统通过实时监测和管理能源使用情况,以提高能源利用效率、…

    2026年9月21日
    000
  • QQ好友消息不提示怎么办 QQ消息通知设置与恢复方法

    手机QQ收不到消息提示通常因通知权限关闭或设置问题,需检查QQ内【新消息通知】开关是否开启;2. 查看手机系统设置中QQ的通知权限,确保允许显示通知并开启声音、震动等提醒;3. 使用QQ内置的【消息通知修复】工具自动修复异常;4. 关闭省电模式或将QQ加入电池优化白名单,确保后台正常运行。 手机QQ…

    2026年9月21日
    000
  • 丛林宝藏猎人必备指南:解锁稀有皮肤与服饰的黄金法则

    谁说稀有皮肤遥不可及?揭开丛林宝箱的秘密,成为雨林猎人的梦想触手可及!这些散发着原始气息与神秘魅力的箱子,蕴藏着极具收藏价值的丛林主题服饰和炫酷夺目的武器皮肤,是每一位冒险者心中的至宝。究竟如何才能将它们收入囊中?三大核心途径为你点亮寻宝之路! 一、零花玩家的宝藏地图:野外探索(免费但拼实力)经典模…

    2026年9月21日
    100
  • win10打开图片提示“没有注册类”怎么办_win10图片打开注册类错误解决方案

    首先重置照片应用并修复系统文件,再通过PowerShell重新注册应用包,最后调整默认应用关联以解决“没有注册类”错误。 如果您尝试在Windows 10中打开图片文件,但系统弹出“没有注册类”的错误提示,则可能是由于默认图片查看应用的注册信息丢失或损坏。以下是解决此问题的步骤: 本文运行环境:De…

    2026年9月21日
    100
  • Xdebug配置与故障排除:解决PHP调试连接导致的网页超时问题

    本文旨在解决Xdebug在IDE未监听调试连接时可能导致的网页加载缓慢或超时问题。我们将深入探讨Xdebug的工作原理、关键配置参数,并提供一套系统的故障排除方法,包括如何启用详细日志记录以及检查多重配置文件的影响,以确保Xdebug仅在需要时激活,避免不必要的性能开销。 1. 理解Xdebug的工…

    2026年9月21日
    000
  • 鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    在《鸣潮》2.7版本中,每位角色都设有专属的隐藏成就与趣味彩蛋。其中,嘉贝莉娜相关的隐藏成就“再会,清醒的猎人”需要玩家满足特定的时间与地点条件方可触发。以下是该成就的详细达成方法汇总。 鸣潮2.7嘉贝莉娜隐藏成就触发条件全解析——地点一: 1、传送到黎那汐塔区域的【烈日酒馆】。 2、进入酒馆后,朝…

    2026年9月21日 用户投稿
    000
  • 《战地6》单人模式“格拉迪乌斯行动”15分钟实机

    《战地6》单人模式“格拉迪乌斯行动”15分钟实机《战地6》单人模式“格拉迪乌斯行动”15分钟实机《战地6》单人模式“格拉迪乌斯行动”15分钟实机《战地6》单人模式“格拉迪乌斯行动”15分钟实机

    媒体巴哈姆特发布了《战地6》单人剧情模式“格拉迪乌斯行动”的15分钟实机演示画面。 00:00 任务3 直布罗陀 海上登陆作战 02:43 任务3 直布罗陀 登陆后的城市巷战 07:38 任务5 纽约 室内近战与桥梁交火 11:31 任务8 塔吉克斯坦 使用空拍设备进行侦察 12:33 任务8 塔吉…

    2026年9月21日 用户投稿
    000
  • 一部手机+蝴蝶号账号,开启你的直播副业之路

    一部手机+蝴蝶号账号,开启你的直播副业之路一部手机+蝴蝶号账号,开启你的直播副业之路一部手机+蝴蝶号账号,开启你的直播副业之路一部手机+蝴蝶号账号,开启你的直播副业之路

    开启直播副业确实可行,但需系统规划与长期坚持。1.选择舒适且有热情的内容领域,如技能教学、生活经验或兴趣分享,确保可持续输出;2.利用智能手机基础设备,搭配支架、补光灯等低成本工具提升画面稳定与光线效果;3.注册直播平台账号后,熟悉后台功能以优化直播体验;4.初期通过社交媒体预告宣传引流,并以高质量…

    2026年9月21日 用户投稿
    000
  • 怎么全选VSCode多个光标_VSCode多光标操作与批量选择文本教程

    VSCode中高效创建多光标的方法包括:Alt+Click手动添加光标,适用于不规则位置;Ctrl+Alt+方向键垂直添加光标,适合连续多行操作;Ctrl+D逐个选择匹配项,精准控制选择范围;Ctrl+Shift+L一次性选择所有匹配项,实现全局批量修改。结合查找替换和列选择模式可进一步提升编辑效率…

    2026年9月21日
    000
  • 安徽一业主私挖地下室致整栋楼开裂,当事人已被正式逮捕

    近日,安徽省霍山县一小区发生了一起严重的公共安全事件。一名业主因私自开挖地下室,导致其所在的整栋居民楼出现严重开裂。记者10月14日从当地相关部门获悉,该名违法开挖的业主目前已被正式逮捕,受损的房屋也已完成了基础加固工作。 回顾:一己私利,危及30余户邻居安全 据了解,此事最早在今年8月被同楼的居民…

    用户投稿 2026年9月21日
    200
  • Spring Boot异常处理:为何需要自定义异常而非仅依赖HTTP状态码

    在Spring Boot应用中,自定义异常提供了比单一HTTP状态码更丰富的错误上下文,能够更精确地传达问题根源。这种细粒度的异常处理不仅提升了代码的可读性和可维护性,也极大地改善了用户体验,使客户端能够基于具体错误类型做出智能响应,而非仅仅接收到一个模糊的状态码。 为什么需要自定义异常? 在构建r…

    2026年9月21日
    100
  • MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率MySQL自动化性能测试方案_MySQL持续监控调优数据库效率

    mysql自动化性能测试和持续监控的核心在于构建闭环反馈系统,包含模拟真实负载、全面数据采集、自动化执行与分析、数据驱动的持续调优四大环节。①测试环境需与生产一致并隔离,使用docker、虚拟机或云沙盒,解决数据同步与脱敏问题;②负载生成工具如sysbench、jmeter、locust或自定义脚本…

    2026年9月21日 用户投稿
    100
  • UC浏览器如何将网页内容分享到微信_UC浏览器网页分享至微信教程

    打开UC浏览器进入目标网页,点击右上角三点菜单选择“分享”,在应用列表中点击微信好友或朋友圈并发送;2. 若分享功能异常,可长按地址栏复制链接后粘贴至微信聊天窗口发送;3. 如需分享特定图文内容,可通过电源键加音量减键截图,再从相册选择图片发送给微信联系人。 如果您想将UC浏览器中浏览的网页内容快速…

    2026年9月21日
    000
  • PHP面向对象编程:解决父类构造器传递值在子对象方法中为空的问题

    本文探讨了PHP中一个常见的面向对象编程问题:当父类构造器接收并初始化一个子对象时,如何确保该子对象内部的方法能正确访问到父类传递的值,避免出现null。文章将通过示例代码,详细介绍两种核心解决方案:通过控制器提供内部对象的访问器(Getter),以及采用依赖注入(Dependency Inject…

    2026年9月21日
    300
  • mac怎么查看具体的内存型号_mac内存型号查询方法

    首先通过“关于本机”查看内存容量与类型,再进入“系统报告”的内存页面获取各插槽的制造商、型号、部件编号和速度等详细信息,最后使用“活动监视器”分析内存使用情况以判断是否需要升级。 如果您想了解Mac设备中安装的内存具体型号和规格,但系统概览仅显示总容量,则需要通过特定工具深入查看硬件信息。以下是查询…

    2026年9月21日
    000
  • CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    答案:CyberLink MediaSuite(核心为PowerDirector)通过AI艺术风格转换、智能对象选取、AI天空替换、音频降噪与运动追踪等功能,显著提升视频制作效率与创意表现。结合模板应用、快捷键操作、媒体库管理及代理编辑等实战技巧,可实现快速剪辑与专业输出,适用于Vlog创作、教育视…

    2026年9月21日 用户投稿
    200
  • 《杀出重围重制版》Steam页面公开!国区预购不到百元

    《杀出重围重制版》Steam页面公开!国区预购不到百元《杀出重围重制版》Steam页面公开!国区预购不到百元《杀出重围重制版》Steam页面公开!国区预购不到百元《杀出重围重制版》Steam页面公开!国区预购不到百元

    在今日凌晨的索尼state of play直播活动中,aspyr正式公布了《杀出重围重制版》的实机演示预告片。 视频观看地址: 《杀出重围重制版》是对Ion Storm工作室经典赛博朋克风格沉浸式模拟游戏的全面重塑。本作在保留原作精髓的基础上,进行了彻底的视觉升级、现代化系统优化以及操作体验改进,旨…

    2026年9月21日 用户投稿
    000
  • 罕见!麒麟9020冲上热搜:华为发布会再度公布麒麟型号

    罕见!麒麟9020冲上热搜:华为发布会再度公布麒麟型号罕见!麒麟9020冲上热搜:华为发布会再度公布麒麟型号罕见!麒麟9020冲上热搜:华为发布会再度公布麒麟型号罕见!麒麟9020冲上热搜:华为发布会再度公布麒麟型号

    9月4日消息,今天下午,微博话题“麒麟9020”冲上热搜榜,引发关注。 据了解,华为Mate XTs非凡大师及全场景新品发布会在深圳正式召开,与此前不同,华为此次在发布会上公布了芯片型号。 全新三折叠Mate XTs非凡大师搭载麒麟9020芯片,这款新品已在华为商城上架,相关页面也展示了芯片型号。 …

    2026年9月21日 用户投稿
    200
  • Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]

    Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]Win10与Ubuntu 18.04双系统安装。(Win10引导Linux)[通俗易懂]

    大家好,很高兴再次与大家见面,我是你们的老朋友全栈君。 作为一个初学者,为了满足自己的求知欲,我按照几位大神写的教程尝试了一遍安装过程,现在来和大家分享一下。 1、Win10安装(如果已经安装,请跳过) 1)制作系统U盘(参考微信公众号“软件安装管家”): https://www.php.cn/li…

    2026年9月21日 用户投稿
    300
  • 百家号视频怎么隐藏?百家号怎么设置仅自己可见

    随着短视频平台的快速发展,其已成为人们获取资讯和休闲娱乐的重要方式。作为国内知名的自媒体平台之一,百家号吸引了大量用户。然而,在享受便捷的同时,隐私安全问题也日益突出。本文将介绍百家号视频隐藏的方法,帮助用户更好地保护个人内容,维护隐私安全。 一、百家号视频隐藏方法 设置隐私权限 在百家号后台,用户…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信