Skip to content

Instantly share code, notes, and snippets.

@marcw
Created July 18, 2017 07:22
Show Gist options
  • Save marcw/7dfbb224c8973d6fa1df79e07c5e0a7c to your computer and use it in GitHub Desktop.
Save marcw/7dfbb224c8973d6fa1df79e07c5e0a7c to your computer and use it in GitHub Desktop.
<?php
namespace AudienceHero\Bundle\FileBundle\Action;
use ApiPlatform\Core\Bridge\Symfony\Validator\Exception\ValidationException;
use AudienceHero\Bundle\FileBundle\Entity\File;
use AudienceHero\Bundle\FileBundle\Factory\FileFactory;
use AudienceHero\Bundle\FileBundle\Uploader\UploaderInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class UploadAction
{
/** @var UploaderInterface */
private $uploader;
/** @var FileFactory */
private $fileFactory;
/** @var ValidatorInterface */
private $validator;
/** @var RegistryInterface */
private $registry;
/** @var SerializerInterface */
private $serializer;
public function __construct(RegistryInterface $registry, FileFactory $fileFactory, UploaderInterface $uploader, ValidatorInterface $validator, SerializerInterface $serializer)
{
$this->registry = $registry;
$this->fileFactory = $fileFactory;
$this->uploader = $uploader;
$this->validator = $validator;
$this->serializer = $serializer;
}
/**
* @Route("/api/upload", name="files_upload")
* @Method({"POST"})
* @Security("has_role('ROLE_USER')")
*/
public function __invoke(Request $request)
{
$request->setRequestFormat('json');
$uploadedFile = $request->files->get('file');
if (!$uploadedFile) {
throw new BadRequestHttpException('No file present in the request');
}
$file = $this->fileFactory->createFromUploadedFile($uploadedFile);
$constraints = $this->validator->validate($file, null, ['upload']);
if (0 !== count($constraints)) {
throw new ValidationException($constraints);
}
$uri = $this->uploader->upload($uploadedFile, '/upload/', $file->getRemoteName());
$file->setUri($uri);
$em = $this->registry->getManager();
$em->persist($file);
$em->flush();
$content = $this->serializer->serialize($file, 'jsonld');
return new Response($content, 200, ['Content-Type' => 'application/ld+json']);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment