Есть ли способ передать объект JsonSerializable в качестве параметра массива? - PullRequest
0 голосов
/ 13 февраля 2020

Я нахожусь в процессе обновления класса REST Api; в конце каждого метода мне нужно вызвать метод DoResponse для преобразования данных, которые я передаю в качестве первого параметра, в строку JSON.

В рамках требований я создал объекты ответа для каждая конечная точка; все эти объекты реализуют \JSONSerializable

class CustomResponseObject implements JsonSerializable {
    public function jsonSerialize() {
        return [/*...*/];
    }
}

Затем я создаю эти объекты в своем методе Api и передаю его в функцию DoResponse.

function myApiEndpoint() {
    $res = new CustomResponseObject();
    /*...*/
    return $this->DoResponse($res);
}

Проблема в том, что указанный метод только принимает массивы в качестве первого параметра.

public function DoResponse(array $response = array());

Я мог бы обойти эту проблему, передав $res->jsonSerialize(), но есть ли способ автоматически jsonSerialize объекта всякий раз, когда я передаю его в функцию DoResponse без изменить базовые методы?

1 Ответ

0 голосов
/ 21 февраля 2020

В конце концов, решение, которое мы решили принять, состоит в том, чтобы изменить сигнатуру и первые несколько строк метода DoResponse() следующим образом:

public function DoResponse($response = array()) {
    if($response instanceof JsonSerializable) {
        $response = $response->jsonSerialize();
    }
    if(is_array($response) === false) {
        // Error handling
    }

    // Previous function body.
}

Ничего захватывающего, но, очевидно, нет никакого способа, в момент, чтобы сделать процесс полностью автоматизированным c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...