@timon_it

Symfony Api Platform — как загрузить фото товара в один запрос к Api?

Есть класс Product
/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 * @ORM\Table(name="product")
 * @ApiResource(
 *   iri="http://schema.org/Product",
 *   collectionOperations={
 *     "get",
 *     "post" = {
 *       "controller" = ProductPostAction::class,
 *       "deserialize" = false,
 *       "openapi_context" = {
 *         "requestBody" = {
 *           "description" = "Фото товара",
 *           "required" = false,
 *           "content" = {
 *             "multipart/form-data" = {
 *               "schema" = {
 *                 "type" = "object",
 *                 "properties" = {
 *                   "file" = {
 *                     "type" = "string",
 *                     "format" = "binary",
 *                     "description" = "Фото товара",
 *                   },
 *                 },
 *               },
 *             },
 *           },
 *         },
 *       },
 *     },
 *   },
 *   itemOperations={"get", "delete"}
 * )
 */

class Product
{
}


и при обращении по api загружаю новый товар и обрабатываю одновременно с запросом загрузку фото товара:
ProductPostAction.php
namespace App\Controller;

use App\Entity\Product;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Attribute\AsController;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use App\Services\FileUploader;
use App\Entity\Image;
use Doctrine\ORM\EntityManagerInterface;

#[AsController]
class ProductPostAction extends AbstractController
{
    public function __construct(
        EntityManagerInterface $entityManager
    )
    {
        $this->entityManager = $entityManager;
    }

    public function __invoke(FileUploader $fileUploader, Request $request)
    {
        $uploadedFiles = $request->files->all();
        $request->getContent();
        $images = [];
        if (isset($uploadedFiles['images'])) {
            foreach ($uploadedFiles['images'] as $uploadedFile) {
                $image = new Image();
                $image->id_shop = $request->get('id_shop');
                $image->product_id = 2;
                $image->position = 0;
                $image->filename = $fileUploader->upload($uploadedFile);
                $this->entityManager->persist($image);
                $images[] = $image;
            }
            $this->entityManager->flush();
        }  
    }
}


Как в контролёре ProductPostAction.php получить сохранённый объект что бы узнать id товара?

Спасибо!
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
@tukreb
Как понимаю Вам нужно загрузить из бд Product и не только его, чтобы сохранить Image
Заинжектите нужные репозитории и получите нужные объекты:
public function __invoke(FileUploader $fileUploader, Request $request, ProductRepository $repository) //или в конструкторе, если можете вызвать репозитории.
{
     $product = $repository->find($request->get('id_product'));
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы