Непосредственно изменить полезную нагрузку класса PendingRequest в Http-клиенте Laravel? - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь создать пакет Laravel для расширения гибкости Http-клиента Laravel, и у меня возникают некоторые проблемы.

Проще говоря, я хотел бы изменить полезную нагрузку запросов POST / PUT / PATCH / DELETE. Я вижу, что класс является Macroable, поэтому я добавил несколько макросов поддержки для установки правильных заголовков, но когда дело доходит до преобразования массива в строку (XML), я не знаю, как перехватить полезную нагрузку , Вот пример кода, который я пишу:

/**
 * Bootstrap Illuminate\Http\Client\PendingRequest with xml methods.
 *
 */
public function registerRequestMacros(): void
{
    $rootElement = 'request';

    PendingRequest::macro('acceptXml', function () {
        return $this->accept('application/xml');
    });

    PendingRequest::macro('convertDataToXml', function () use ($rootElement) {
        // Transform the data to xml if it is an array
        $this->beforeSending(function (\Illuminate\Http\Client\Request $request, array $options) use ($rootElement) {
            if (is_array($options[$this->bodyFormat]) && !empty($options[$this->bodyFormat])) {
                $options[$this->bodyFormat] = ArrayToXml::convert($options[$this->bodyFormat], $rootElement);
            }
        });
    });

    PendingRequest::macro('asXml', function () {
        $this->convertDataToXml();
        return $this->bodyFormat('xml')->contentType('application/xml');
    });
}

Вы видите, что я пытаюсь использовать метод beforeSending(), и на первый взгляд кажется, что массив превращается в действительный XML, но когда я запускаю реальный класс, это ничего не меняет. Можно ли изменить полезную нагрузку запроса, не создавая собственный класс PendingRequest и не заставив мой пакет make Laravel внедрить мой класс, который расширяет базовый класс, просто для изменения полезной нагрузки запроса? Я действительно не хочу этого делать, если это вообще возможно.

Есть ли способ преобразовать $this->bodyFormat в xml перед отправкой запроса? Я знаю, что Guzzle будет учитывать строку xml в запросе в указанном формате, который класс PendingRequest отправляет.

...