gpt4 book ai didi

php - symfony 服务容器中的回调参数

转载 作者:搜寻专家 更新时间:2023-10-31 21:00:59 24 4
gpt4 key购买 nike

我正在使用 Symfony 的注入(inject)容器和 Serializer 组件,每次都提供具有默认序列化配置的服务。专门使用 ObjectNormalizer:

 <service
id="my_bundle.entity_serializer_normalizer"
class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer"
>
<argument type="service" id="my_bundle.entity_serializer_normalizer_metadata_factory" />
<argument>null</argument>
<argument>null</argument>
<argument type="service" id="my_bundle.entity_serializer_normalizer_reflection_extractor" />

<call method="setIgnoredAttributes">
<argument type="collection">
<argument>__initializer__</argument>
<argument>__cloner__</argument>
<argument>__isInitialized__</argument>
</argument>
</call>

</service>

但是我还需要调用此服务上的一个方法来设置循环引用处理程序。在普通的 PHP 中,这看起来像这样:

$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getId();
});

但是,我似乎找不到将其添加到 <call> 的方法在容器中。

我研究过使用新的表达式引擎功能来尝试这个,但它似乎与回调不匹配。我还考虑过在某处添加一个独立函数并注册它是否可以完成这项工作。现在,我正在将方法调用破解到我的序列化程序注入(inject)到的类中。

我还尝试通过辅助 PHP 定义手动添加它:

$container->set(
'tactic_monolith.entity_serializer_normalizer_circular_reference_handler',
function ($object) {
return $object->getId();
}
);

然而它似乎被默默地忽略了。执行 setParameter 时收到错误消息(可调用对象不能是参数)。我还尝试将此注册为合成服务。

最佳答案

似乎不使用工厂就无法做到这一点。

class CircularHandlerFactory
{
public static function getId(){
return (function ($object) {
return $object->getId();
});
}
}

<service
id="some_bundle.circular_reference_handler"
class="callback"
>
<factory class="SomeBundle\CircularHandlerFactory" method="getId" />
</service>

最后添加对规范器的调用:

<call method="setCircularReferenceHandler">
<argument type="service" id="some_bundle.circular_reference_handler"/>
</call>

事后看来,这可能是对该功能的不当使用。然而,对于表达引擎的功能请求,这可能也是值得的。

关于php - symfony 服务容器中的回调参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42615474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com