Публикация API в Sonata Media Bundle Symfony 3

Моя цель - отправить изображение из приложения Ionic (на данный момент тестируем с PostMan) в мою базу данных на основе Symfony 3 с помощью Sonata Media Bundle.

Это документация, но она довольно короткая. и я застрял на 15.3. ОТПРАВКА МЕДИА ФАЙЛА процесс.

Мне удалось получить следующий процесс в Bundle и проверить данные. c:\wamp64\www\bumblb___api\vendor\sonata-project\media-bundle\Controller\Api\MediaController.php > функция handleWriteMedium().

/**
 * Write a medium, this method is used by both POST and PUT action methods.
 *
 * @param Request                $request
 * @param MediaInterface         $media
 * @param MediaProviderInterface $provider
 *
 * @return View|FormInterface
 */
protected function handleWriteMedium(Request $request, MediaInterface $media, MediaProviderInterface $provider)
{
    $form = $this->formFactory->createNamed(null, 'sonata_media_api_form_media', $media, array(
        'provider_name' => $provider->getName(),
        'csrf_protection' => false,
    ));

    // return $media;
    // return $request->__toString();

    // THE FORM DOES NOT FILL WITH REQUEST
    $form->handleRequest($request);
    return $form->getData();
    // return $media;


    if ($form->isValid()) {

        $media = $form->getData();
        $this->mediaManager->save($media);

        $view = FOSRestView::create($media);

        // BC for FOSRestBundle < 2.0
        if (method_exists($view, 'setSerializationContext')) {
            $serializationContext = SerializationContext::create();
            $serializationContext->setGroups(array('sonata_api_read'));
            $serializationContext->enableMaxDepthChecks();
            $view->setSerializationContext($serializationContext);
        } else {
            $context = new Context();
            $context->setGroups(array('sonata_api_read'));
            $context->setMaxDepth(0);
            $view->setContext($context);
        }

        return $view;
    } else {
        // return "NOT VALID";
    }

    return $form;
}

Который называется быть вот этим:

/**
 * Adds a medium of given provider
 * If you need to upload a file (depends on the provider) you will need to do so by sending content as a multipart/form-data HTTP Request
 * See documentation for more details.
 *
 * @ApiDoc(
 *  resource=true,
 *  input={"class"="sonata_media_api_form_media", "name"="", "groups"={"sonata_api_write"}},
 *  output={"class"="Sonata\MediaBundle\Model\Media", "groups"={"sonata_api_read"}},
 *  statusCodes={
 *      200="Returned when successful",
 *      400="Returned when an error has occurred while medium creation",
 *      404="Returned when unable to find medium"
 *  }
 * )
 *
 * @Route(requirements={"provider"="[A-Za-z0-9.]*"})
 *
 * @param string  $provider A media provider
 * @param Request $request  A Symfony request
 *
 * @return MediaInterface
 *
 * @throws NotFoundHttpException
 */
public function postProviderMediumAction($provider, Request $request)
{
    $medium = $this->mediaManager->create();
    $medium->setProviderName($provider);

    try {
        $mediaProvider = $this->mediaPool->getProvider($provider);
    } catch (\RuntimeException $ex) {
        throw new NotFoundHttpException($ex->getMessage(), $ex);
    } catch (\InvalidArgumentException $ex) {
        throw new NotFoundHttpException($ex->getMessage(), $ex);
    }

    return $this->handleWriteMedium($request, $medium, $mediaProvider);
}

Я решил сделать это с помощью JSON с POSTMAN. Данные формы не работают.

http://127.0.0.1:8000/api/providers/sonata.media.provider.image/media

{
"name": "nameex",
"description": "descriptionex",
"copyright": "copyrightex",
"authorName": "authorNameex",
"cdnIsFlushable": true,
"enabled": true,
"binaryContent": "data:image/jpeg;base64,test"
}

разные возвращаются, которые я пишу для проверки:

вернуть $form->getData();

{
        "provider_metadata": [],
        "enabled": false,
        "provider_name": "sonata.media.provider.image"
    }

вернуть $request->__toString();

"POST /api/providers/sonata.media.provider.image/media HTTP/1.1\r\nAccept:          */*\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4\r\nAuthorization:   Basic c3VwZXI6c3VwZXI=\r\nCache-Control:   no-cache\r\nConnection:      keep-alive\r\nContent-Length:  201\r\nContent-Type:    application/json\r\nHost:            127.0.0.1:8000\r\nOrigin:          chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop\r\nPhp-Auth-Pw:     super\r\nPhp-Auth-User:   super\r\nPostman-Token:   16103fb6-3847-efe8-9cc6-7aa2a48b4ff9\r\nUser-Agent:      Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36\r\nX-Php-Ob-Level:  1\r\n\r\n{\n\t\"name\": \"namee\",\n\t\"description\": \"description\",\n\t\"copyright\": \"copyright\",\n\t\"authorName\": \"authorName\",\n\t\"cdnIsFlushable\": true,\n\t\"enabled\": true,\n\t\"binaryContent\": \"data:image/jpeg;base64,patata\"\n}"

Запрос вроде бы в порядке, но форма им не заполняется. Я сравниваю запрос с другим сообщением формы, которое работает, это та же структура.

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

Я могу найти решение для тестирования данных формы другим способом. Попытка отправить реальное значение изображения baseEncode.

Я знаю, что это очень специфический случай, но если бы кто-то был в этом случае или мог бы предложить мою другую точку зрения, было бы замечательно. Или мне придется отказаться от Media Bundle, который отлично работает с админкой и ресепшеном только из-за этого :(

Спасибо


person Paul Leclerc    schedule 27.08.2017    source источник
comment
Если я использую формат multipart/form-data с использованием POSTMAN, с binaryContent в качестве файла, у меня есть ответ: Unexpected '', когда я возвращаю $request__toString().   -  person Paul Leclerc    schedule 27.08.2017


Ответы (1)


Решение состояло в том, чтобы просто не переопределять тип содержимого заголовков POSTMAN при использовании формата типа данных формы.

Переопределение POSTMAN Content-Type делает отправку POST пустой.

После моих тестов в Postman я использовал формат изображения DATA_URL, чтобы отправить его с помощью Ionic и API MediaBundle. (с преобразованием BLOB-объектов и системой javascript FormData)

person Paul Leclerc    schedule 28.09.2017