ApiPlatform & Mercure(私密话题)

ApiPlatform & Mercure (private topics)

我的架构基于 Symfony 4.4 / ApiPLatform / Mercure / Angular 9. 我通过在我的 resources.yaml ApiPlatform conf 中添加 mercure:true 来简单地从 Mercure 推送文件。现在我需要将更新设为私有。因此,对于 ApiPlatform,我必须添加参数 private:true。 但是 API 现在的响应是:

Targets do not exist anymore since Mercure 0.10. Mark the update as private instead or downgrade the Mercure Component to version 0.3

这是我的 yaml 配置:

resources:
    App\Entity\Order:
        attributes:
            mercure:
                - private: true
                - topics: ['object.getMercureTopics()']

正确的配置应该是什么?

事实上,ExpressionLanguage并没有像我想的那样在每个选项中都被评估,只有当配置的选项是一个字符串时才会被评估。 因此,如果主题(或其他所有内容)需要 ExpressionLanguage,解决方案如下:

public function getMercureOptions()
{
    $topic = sprintf(
        '%s/%s',
        self::MERCURE_TOPIC_PREFIX,
        $this->getSomethingFromTheObject()
    );

    return [
        "private" => true,
        "topics" => [$topic]
    ];
}

然后,yaml 配置文件应该是:

resources:
    App\Entity\Order:
        attributes:
            mercure: "object.getMercureOptions()"