比较一下
$isEnableAborting: '%checkout.coupon.aborting.enabled%'
和
$isEnableAborting: '@checkout.coupon.aborting.enabled'
据我所知, @是应用服务的id,%用来包裹应用定义的变量
比较一下
$isEnableAborting: '%checkout.coupon.aborting.enabled%'
和
$isEnableAborting: '@checkout.coupon.aborting.enabled'
据我所知, @是应用服务的id,%用来包裹应用定义的变量
在测试的时候,需要获取symfony的里所有的的message handler,该如何做到呢?
通过 messenger.message_hanlder 就可以。
比如你的测试需要测试所有的 message handler
1 在容器中注册一个provider ,比如 MessengerHanlderProvider
App\Tests\Functional\StaticCodeAnalysis\MessengerHandlerProvider:
public: true
arguments:
$handlers: !tagged_iterator messenger.message_handler
2 然后实现该provider类 class App\Tests\Functional\StaticCodeAnalysis\MessengerHandlerProvider ,它只有一个作用,就是接受一个返回所有handler迭代器,它的构造函数的为 !tagged_iterator messenger.message_handler。
public function __construct(iterable $handlers)
{
$this->handlers = iterator_to_array($handlers);
}
意思就是返回给我所有的tag标记部位MessageHandler的类。因为我们在用Messenger定义消息的hanlder的时候,都按照教程,给每个定义为hanlder的类加上这个标签。比如:
#[AsMessageHandler]
readonly class FinalizeCancellationsHandler
{... }
#[AsMessageHandler]
class SyncCancellationsHandler
{...}
这样就可以轻松获取所有的messenger 的handler了。
3 在测试中需要用到返回所有消息handler的时候,只要问容器去要就可以了。比如
static::getContainer()->get(MessengerHandlerProvider::class);
相关视频教程
在改进版本中,我们使用symfony的scoped的http客户端代替原来的guzzle client。这样做的优点是,把一些基本的host配置可以从代码中抽出来,放入yaml配置中。这样在使用中,只要使用对应的名字,symfony框架就会把对应的已经配置好host的http client注入。
在测试中,我们使用的symfony提供的mock client而不是真正的scoped client,免得发出真正的http请求。
目前的问题是,除了http client,我们还有一个考虑到不同stroefront的client,称为“storefrontAwareClient”。它是在http client外面再包裹的一层。主要是解决,不同的国家(storefront)使用不同的base url和header。
在集成测试用,发现注入的不是mock client,而是真的scoped client。所以需要对stroefront进行针对测试环境的配置。保证在测试中,它注入的也是mock client
StorefrontAwareClient. 它替代了本来MarketplaceLoyaltyAccountService的部分功能
找到原因
1 测试中使用“personalized_coupons.client”未配置。因为配置被改名了。加入该key,并指出它是mock的httpClient后,问题解决
在创建scoped client的配置里,有一个选项是scope。一直到我看了源码后才明白它的作用。当请求一个URL的时候,可以匹配scope里的正则表达,只有匹配的情况下,才会使用该配置。如果不匹配,请求也能发出,但是配置里的东西不会被发出。这样保证,一些秘密不会因为错误的配置被发送到其他网站。
一开始我还以为是某种强制的检查,如果不匹配就会抛除异常。
php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity
另外在使用的时候,doctrine老说 Malformed database connection URL 错误。 是数据库配置问题。后来查了一下这里,说是DATABASE_URL中的特殊符号,比如我的密码中的#导致解析失败。更改密码,去除特殊符号就ok了。