Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение Rodman »

Всем привет
У меня написано два проекта, на которых реализован REST API

Последняя версия на которой все нормально работало, было 2.0.15.1
Под работало я подразумеваю (к примеру) банальное приветствие выглядит вот так - https://prnt.sc/mm03h6
Если посмотреть исходных код этой страницы - то он выдаст

Код: Выделить всё

{
    "status": 1,
    "data": [
        "RESTful API for you!"
    ]
}
Но после обновления вендоров до 2.0.16 - приветствие начало ругаться - SyntaxError: JSON.parse: unexpected non-whitespace character after JSON data at line 6 column 2 of the JSON data
Вот пример - https://prnt.sc/mm06zy

А исходный код этой ругани выглядет так

Код: Выделить всё

{
    "status": 1,
    "data": [
        "RESTful API for you!"
    ]
}null
т.е. в конце JSON'ины появился загадочный null

я пошел смотреть - откуда эта нечисть берется...
И опытным путем увидел, что это результат вызова Yii::$app->end();

Вот вся функция

Код: Выделить всё

public function sendSuccessResponse($data = false, $additional_info = false)
{
        $this->setHeader(200);

        $response = [];
        $response['status'] = 1;

        if (is_array($data))
            $response['data'] = $data;

        if ($additional_info) {
            $response = array_merge($response, $additional_info);
        }

        $response = Json::encode($response, JSON_PRETTY_PRINT);

        if (isset($_GET['callback'])) {
            /* this is required for angularjs1.0 client factory API calls to work */
            $response = $_GET['callback'] . "(" . $response . ")";

            echo $response;
        } else {
            echo $response;
        }
        Yii::$app->end();
}
Если перед Yii::$app->end(); поставить exit(); - то проблема отпадает...

Но хотел узнать, на сколько это правильно? Почему в последней версии такой загадочный эффект и как мне с ним обойтись, чтобы не нарушить дзень всех канонов программирования Yii2 и у меня в ответе не появлялся null?

Заранее спасибо
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение urichalex »

По тому, что нужно делать правильно

Код: Выделить всё

return $this->asJson(['status' => 1, 'data' => ['RESTful API for you!']]);
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение SiZE »

Код: Выделить всё

public function sendSuccessResponse($data = false, $additional_info = false)
{
    $response = ['status' => 1];
    if (is_array($data)) {
        $response['data'] = $data;
    }
    if ($additional_info) {
        $response = array_merge($response, $additional_info);
    }

    if ($callback = Yii::$app->request->get('callback')) {
        Yii::$app->reponse->format = \yii\web\Response::FORMAT_RAW;
        
        return $callback . '(' . json_encode($response) . ')';
    } else {
        return $this->asJson($response);
    }
}
Но это дич какая-то. Неужели ангуляр требует то application/json то plain/text?
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение Rodman »

Вы имеете ввиду, что никакого Yii::$app->end(); и в помине не надо тут использовать?
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение Rodman »

Мне кажется, вы меня не туда ведете:
1. Я попробовал вышеописаный код от SiZe.. результате в конце JSON'ины все равно null
2. Я понимаю, что return или echo данном случае не принципиален... это уже вывод на экран
3. Основной вопрос про end(); - он то и возвращает null, вот и в этот то вопрос: почему и как сделать чтобы не возращал и не ругался?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение someweb »

Уберите $app->end().
Возвращайте return ом в экшене контроллера, а не в каком тот левом методе и все будет нормально.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение Rodman »

На самом деле и это не корректный вариант... Что от в конце еше происходит и рождается null
Если в конце экшина ставлю exit();, то в ответе все нормально...

Но как по мне то это костыль.
И я думаю, что должен быть более элегантный метод
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение urichalex »

Так ваше решение само по себе костыль. Вашим Yii::$app->end() - костыль над костылем. Нужно использовать конструкции фреймворка, иначе зачем вообще его использовать
Rodman
Сообщения: 52
Зарегистрирован: 2018.06.01, 20:33
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение Rodman »

я использовал пример https://github.com/sirinibin/Yii2-RESTf ... ith-OAuth2
для реализации своего API

Оспаривать не буду костыль или нет, но работало до обновления версии...

Пока сделал exit();
Но если кто то знает объяснение, откуда взялся в версии Yii2 2.0.16 злощасный null в Yii::$app->end() - буду благодарен за информация
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение maleks »

Последите за этим issue, там вроде о похожем:
https://github.com/yiisoft/yii2/issues/17207
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Изменился результат функции Yii::$app->end(); в последней версии 2.0.16

Сообщение samdark »

В 2.0.16.1, случаем, не фикснуто?
Ответить