dongzhu3548 2019-08-19 06:07 采纳率: 0%
浏览 1105

如何修复'预期类型'Psr \ Http \ Message \ RequestInterface'?

我尝试使用 guzzlehttp/guzzle来发送邮件,但它却报错了。

我试过把 Psr7\Request 换成\Psr\Http\Message\RequestInterface,但还是没用,还报了另外的错误:

'Cannot instantiate interface Psr\Http\Message\RequestInterface'.

我不知道该怎么办了。

public function requestAsync($method, $uri = '', array $options = [])
    {
        $options = $this->prepareDefaults($options);
        // Remove request modifying parameter because it can be done up-front.
        $headers = isset($options['headers']) ? $options['headers'] : [];
        $body = isset($options['body']) ? $options['body'] : null;
        $version = isset($options['version']) ? $options['version'] : '1.1';
        // Merge the URI into the base URI.
        $uri = $this->buildUri($uri, $options);
        if (is_array($body)) {
            $this->invalidBody();
        }
        $request = new Psr7\Request($method, $uri, $headers, $body, $version);
        // Remove the option so that they are not doubly-applied.
        unset($options['headers'], $options['body'], $options['version']);

        return $this->transfer($request, $options);
    }

它给了这个错误提示:

( Expected type 'Psr\Http\Message\RequestInterface'. Found 'GuzzleHttp\Psr7\Request' ).

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-11 09:24
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你似乎在尝试将一个带有特定方法的类转换为一个接口,并试图将其传递给另一个方法。在你的代码中,你有:

    $request = new Psr7\Request($method, $uri, $headers, $body, $version);
    // Remove the option so that they are not doubly-applied.
    unset($options['headers'], $options['body'], $options['version']);
    

    在这个过程中,你需要先创建一个新的 Request 实例,然后设置它的属性以匹配你要传递的接口。你可以这样做:

    $request = new Psr7\Request(
        $method,
        $uri,
        $headers,
        $body,
        $version
    );
    
    $options = $this->prepareDefaults($options);
    $interfaceOptions = ['version' => $options['version']];
    $interfaceRequest = new $interfaceClass($request, $options);
    

    这会创建一个新的 Request 实例,并设置其所有属性以匹配你要传递的接口。然后,你可以像这样传递它:

    return $this->transfer($interfaceRequest, $options);
    

    注意,这里我们使用了一个泛型 $interfaceClass 来指定要使用的接口类名。如果你有一个具体的实现,你可能需要使用那种实现的名称。

    评论

报告相同问题?