namespace Dennis\UploadBundle\Types; use Doctrine\DBAL\Types\Type; use Doctrine\DBAL\Platforms\AbstractPlatform; class UploadType extends Type { const UPLOAD = 'upload'; public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform) { return $platform->getClobTypeDeclarationSQL($fieldDeclaration); } public function getName() { return self::UPLOAD; } public function requiresSQLCommentHint(AbstractPlatform $platform) { return true; } }
use Doctrine\ODM\MongoDB\DocumentManager; // ... private $dm; public function setDocumentManager(DocumentManager $dm) { $this->dm = $dm; }
use Dennis\UploadBundle\Document\Upload; use Doctrine\DBAL\Types\ConversionException; // ... public function convertToDatabaseValue($value, AbstractPlatform $platform) { if (empty($value)) { return null; } if ($value instanceof Upload) { return $value->getId(); } throw ConversionException::conversionFailed($value, self::UPLOAD); }
// ... public function convertToPHPValue($value, AbstractPlatform $platform) { if (empty($value)) { return null; } return $this->dm->getReference('Dennis\UploadBundle\Document\Upload', $value); }
namespace Dennis\UploadBundle; use Symfony\Component\HttpKernel\Bundle\Bundle; use Doctrine\DBAL\Types\Type; class DennisUploadBundle extends Bundle { public function __construct() { if (!Type::hasType('upload')) { Type::addType('upload', 'Dennis\UploadBundle\Types\UploadType'); } } public function boot() { $dm = $this->container->get('doctrine.odm.mongodb.document_manager'); /* @var $type \Dennis\UploadBundle\Types\UploadType */ $type = Type::getType('upload'); $type->setDocumentManager($dm); } }
namespace Acme\DemoBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class Image { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string", length=100) */ protected $name; /** * @ORM\Column(type="upload") */ protected $image; public function getId() { return $this->id; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setImage($image) { $this->image = $image; } public function getImage() { return $this->image; } }
namespace Acme\DemoBundle\Controller; use Dennis\UploadBundle\Document\Upload; class ImageController extends Controller { public function newAction(Request $request) { // ... $form->bind($request); if ($form->isValid()) { /** @var $upload \Symfony\Component\HttpFoundation\File\UploadedFile */ $upload = $image->getImage(); $document = new Upload(); $document->setFile($upload->getPathname()); $document->setFilename($upload->getClientOriginalName()); $document->setMimeType($upload->getClientMimeType()); $dm = $this->get('doctrine.odm.mongodb.document_manager'); $dm->persist($document); $dm->flush(); $image->setImage($document); $em = $this->getDoctrine()->getManager(); $em->persist($image); $em->flush(); } } }
/** * @Route("/{id}", name="image_show") */ public function showAction($id) { $image = $this->getDoctrine()->getManager() ->getRepository('AcmeDemoBundle:Image') ->find($id); $response = new Response(); $response->headers->set('Content-Type', $image->getImage()->getMimeType()); $response->setContent($image->getImage()->getFile()->getBytes()); return $response; }
Source: https://habr.com/ru/post/314966/
All Articles