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

2024-08-11 0 1,010

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

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

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

这是我的做法…

背景

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

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

例如:

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

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

值对象

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

namespace app\domain\model\twilio\sid;

use assert\assert;

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() 方法定义正确的前缀。

1

2

3

4

5

6

7

8

9

10

11

namespace app\domain\model\twilio\sid;

final readonly class accountsid

{

    use twiliostringidentifier;

    private function getprefixforsidtype(): string

    {

        return 'ac';

    }

}

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

注入实例化对象

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

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

定义特定值对象实例

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

1

2

3

app\path\to\my\service:

    class: app\path\to\my\service

    arguments: []

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

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

服务.yaml

1

2

3

4

5

6

7

8

9

10

11

12

# create services named with a global "namespace"

global\twilio\sid\account:

    factory: ['app\domain\model\twilio\sid\accountsid', 'fromstring']

    arguments: ['%env(twilio_account_sid)%']

global\twilio\sid\api:

    factory: ['app\domain\model\twilio\sid\apisid', 'fromstring']

    arguments: ['%env(twilio_api_sid)%']

global\twilio\sid\application:

    factory: ['app\domain\model\twilio\sid\applicationsid', 'fromstring']

    arguments: ['%env(twilio_app_sid)%']

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

1

2

3

4

5

6

app\service\vendor\twilio\twilioservice:

    arguments:

        $accountsid: '@global\twilio\sid\account'

        $apisid: '@global\twilio\sid\api'

        $applicationsid: '@global\twilio\sid\application'

        $apisecret: '%env(twilio_api_secret)%'

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

twilio服务

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

namespace App\Service\Vendor\Twilio;

use App\Domain\Model\Twilio\Sid\AccountSid;

use App\Domain\Model\Twilio\Sid\ApiSid;

use App\Domain\Model\Twilio\Sid\ApplicationSid;

final readonly class TwilioService

{

    public function __construct(

        private AccountSid $accountSid,

        private ApiSid $apiSid,

        private ApplicationSid $applicationSid,

        private string $apiSecret

    ) {}

}

瞧!

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

干杯,祝编码愉快!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

免责声明
1. 本站所有资源来源于用户上传和网络等,如有侵权请邮件联系本站整改team@lcwl.fun!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系本站工作人员处理!
6. 本站资源售价或VIP只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 因人力时间成本问题,部分源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
9.本站所有源码资源都是经过本站工作人员人工亲测可搭建的,保证每个源码都可以正常搭建,但不保证源码内功能都完全可用,源码属于可复制的产品,无任何理由退款!

网站搭建学习网 PHP 将值对象注入到自动装配的 Symfony 服务中 https://www.xuezuoweb.com/10703.html

常见问题
  • 本站所有的源码都是经过平台人工部署搭建测试过可用的
查看详情
  • 购买源码资源时购买了带主机的套餐是指可以享受源码和所选套餐型号的主机两个产品,在本站套餐里开通主机可享优惠,最高免费使用主机
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

Fa快捷助手
手机编程软件开发

在手机上用手点一点就能轻松做软件

去做软件
链未云主机
免备案香港云主机

开通主机就送域名的免备案香港云主机

去使用
链未云服务器
免备案香港云服务器

支持售后、超低价、稳定的免备案香港云服务器

去使用