Я недавно завершил миграцию моего приложения Parse PHP на сервер Parse, размещенный в Google Cloud. С тех пор пакетные действия, такие как ParseObject::saveAll()
, ParseObject::destroyAll()
и т.д. начали выходить из строя в большинстве случаев. Я думаю об этом как об ошибке на GitHub, но хочу убедиться, что это не только мой экземпляр.
Я даже не могу воспроизвести Тестовый код GitHub PHP SDK для destroyAll:
...
$o1 = ParseObject::create('TestObject');
$o2 = ParseObject::create('TestObject');
$o3 = ParseObject::create('TestObject');
ParseObject::saveAll([$o1, $o2, $o3]);
ParseObject::destroyAll([$o1, $o2, $o3]);
...
И этот код, и использование пакетных действий моего приложения генерируют следующие исключения в PHP (в этом примере ошибка выдается saveAll):
Неопределенное исключение ‘Parse \ ParseException’ с сообщением ‘не может маршрутизировать пакетный путь / 1 / classes / TestObject’
Отладка показывает, что Parse Server возвращает код ошибки 107 который согласно документация означает неверный JSON. Я не знаком с REST API, но для этого примера отправленные данные
{ «просьбы»: [{ «метод»: «POST», «путь»: «/ 1 / классы / TestObject», «тело»: []}, { «метод»: «POST», «путь»:» / 1 / классы / TestObject», «тело»: []}, { «метод»: «POST», «путь»: «/ 1 / классы / TestObject», «тело»: []}]}
Что является действительным JSON.
Пакетные действия работали правильно перед миграцией. Версия PHP 5.6. Любая помощь приветствуется. Если ошибка может быть воспроизведена, я создам проблему на GitHub.
Решение было написать /parse/classes/ClassName
вместо /1/classes/ClassName
, Таким образом, после миграции, детали, указанные в документации на https://parse.com/docs/rest/guide, устарели.
!!! это может измениться в будущем !!! следить за этой проблемой: https://github.com/ParsePlatform/parse-php-sdk/issues/229
На всякий случай, если кто-то все еще ищет это, вот решение, размещенное на github.
Я копался в этом немного больше. Оказывается, сервер выполняет некоторые операции с URL-адресами, которые он получает для пакетных запросов. В частности, он проверяет, что ваш префикс API (/parse
в большинстве случаев) соответствует тому, что было отправлено. С пакетными запросами отдельные запросы не содержат этого, и они заканчиваются тем, что провалили это соответствие. Тестируя код, который вы выложили выше, я смог его исправить. Это работает, но я, вероятно, посмотрю, смогу ли я написать лучший патч в будущем.
В настоящее время вам нужно добавить префикс api как /your_prefix/
(опять же в большинстве случаев это /parse
, но используйте тот, который вы настроили для своего сервера) в двух местах для пакетного сохранения и удаления, как показано ниже.
ParseObject.php private static function deepSave($target, $useMasterKey = false)
(то же самое место, где добавляется / 1 /)
foreach ($requests as &$r) {
$r['path'] = '/parse/' . $r['path'];
}
ParseObject.php private static function destroyBatch(array $objects, $useMasterKey = false)
foreach ($objects as $object) {
$data[] = [
'method' => 'DELETE',
'path' => '/parse/classes/'.$object->getClassName().'/'.$object->getObjectId(),
];
}
После того, как эти два пятна изменились, я смог получить пакетные сейвы & удаляет работает правильно. Я также заметил ту же проблему, что и раньше, только для подтверждения.