【问题标题】:Twilio Symfony - The controller must return a \"Symfony\\Component\\HttpFoundation\\Response\" but returned Twilio\\TwiML\\VoiceResponse."Twilio Symfony - 控制器必须返回 \"Symfony\\Component\\HttpFoundation\\Response\" 但返回 Twilio\\TwiML\\VoiceResponse。"
【发布时间】:2021-02-10 13:30:18
【问题描述】:

我想用Symfony5ApiPlatform实现Twilio浏览器到浏览器的调用

我正在关注这个教程:

https://www.twilio.com/docs/voice/client/tutorials/calls-between-devices?code-sample=code-generate-twiml-from-client-parameters-3&code-language=PHP&code-sdk-version=5.x

我有这个功能,这是我想要配置我的TwiML 应用程序的功能

    /**
     * @Route("/twilio/handle/twiml/{clientId}", name="twilio_handl_twiml")
     * @param $clientId
     * @return VoiceResponse
     */
    public function handleTwiml($clientId): VoiceResponse
    {
        /** @var Client $client */
        $client = $this->clientRepository->findOneBy(['id' => 11]);
        $to = $client->getUser()->getLastName().$client->getUser()->getId();


        $voiceResponse = new VoiceResponse();
        $number = htmlspecialchars($to);
        $dial = $voiceResponse->dial(null, array('callerId' => '+15017122661'));

        if (isset($to)) {
            if (preg_match("/^[\d\+\-\(\) ]+$/", $number)) {
                $dial->number($number);
            } else {
                $dial->client($number);
            }
        } else {
            $voiceResponse->say('There has been an issue. Thanks for calling!');
        }

        return $voiceResponse;
    }

我已在"get" 部分中将其声明为我的一个实体上的自定义路由:


 *          "twilio_handl_twiml"={
 *            "path"="/twilio/handle/twiml/{clientId}",
 *            "controller"="TwilioController:class"
 *          },

现在该函数创建了一个正确的VoiceResponse 对象

但是当我调用这条路线时,我收到以下错误消息:

The controller must return a "Symfony\Component\HttpFoundation\Response" object but it returned an object of type Twilio\TwiML\VoiceResponse.

现在有谁知道为什么我不能从自定义路由返回任何我想要的 Response 吗?

我真的不明白为什么框架会将此声明为错误

如果有人能帮助我更好地理解这个错误,我将不胜感激

谢谢!

【问题讨论】:

  • Symfony 期望响应来自 Symfony 响应对象。对 Twilio 源代码的快速检查显示 VoiceResponse 不是从 Symfony Response 类派生的。我会寻找一个 Twilio Bundle 包,它可以使 Twilio 适应 Symfony。
  • 感谢您的意见!我正在研究这个,到目前为止还没有找到太多的文档或解决方案,但无论如何都会在这里发布更新。谢谢

标签: symfony twilio twilio-api api-platform.com twilio-php


【解决方案1】:

这里是 Twilio 开发者宣传员。

正如@Cerad 在 cmets 中所说,您需要使用派生自 Symfony Response 对象的对象进行响应。

我没有使用过 Symfony,如果有错误请见谅,但我认为您可以将处理程序更新为以下内容,它可能会起作用:

    use Symfony\Component\HttpFoundation\Response;

    /**
     * @Route("/twilio/handle/twiml/{clientId}", name="twilio_handl_twiml")
     * @param $clientId
     * @return Response
     */
    public function handleTwiml($clientId): VoiceResponse
    {
        /** @var Client $client */
        $client = $this->clientRepository->findOneBy(['id' => 11]);
        $to = $client->getUser()->getLastName().$client->getUser()->getId();


        $voiceResponse = new VoiceResponse();
        $number = htmlspecialchars($to);
        $dial = $voiceResponse->dial(null, array('callerId' => '+15017122661'));

        if (isset($to)) {
            if (preg_match("/^[\d\+\-\(\) ]+$/", $number)) {
                $dial->number($number);
            } else {
                $dial->client($number);
            }
        } else {
            $voiceResponse->say('There has been an issue. Thanks for calling!');
        }
        
        $response = new Response(
            $voiceResponse->asXML(),
            Response::HTTP_OK,
            ['content-type' => 'application/xml']
        );

        return $response;
    }

这里的关键是使用语音响应的内容 ($voiceResponse->asXML()) 构建 Symfony 响应,并将内容类型设置为 application/xml

【讨论】:

  • 真正的布道者!非常感谢它完成了工作!
  • 好消息!我还有时间成为一名 Symfony 开发人员!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 2016-01-04
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2018-10-02
  • 2017-09-21
相关资源
最近更新 更多