Doctrine - Subir archivos
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Gonzalo Alonso |@Gonz...
Cómo manejar archivos subidos con
Doctrine
Puedes integrar la carga de archivos en el ciclo de vida de
tu entidad (es deci...
Configuración básica
/**
* @ORMColumn(type="string", length=255,
nullable=true)
*/
public $path;
La propiedad ruta almacen...
public function getAbsolutePath()
{
return null === $this->path
? null
: $this->getUploadRootDir().'/'.$this->path;
}
El g...
public function getWebPath()
{
return null === $this->path
? null
: $this->getUploadDir().'/'.$this->path;
}
getWebPath() ...
protected function getUploadRootDir()
{
// la ruta absoluta del directorio donde se deben
// guardar los archivos cargados...
public function uploadAction()
{
// ...
$form = $this->createFormBuilder($document)
->add('name')
->add('file')
->getForm(...
// src/Acme/DemoBundle/Entity/Document.php
// ...
class Document
{
/**
* @AssertFile(maxSize="6000000")
*/
public $file;
/...
<h1>Subir archivo</h1>
<form action="#" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submi...
Subir archivo
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$document->upload();
$em->persist($documen...
public function upload()
{
if (null === $this->file) {
return;
}
$this->file->move(
$this->getUploadRootDir(),
$this->file...
Usando el ciclo de vida de las retrollamadas
¿Qué pasa si hay un problema al persistir la entidad?
/**
* @ORMEntity
* @ORM...
class Document
{
/**
* @ORMPrePersist()
* @ORMPreUpdate()
*/
public function preUpload()
{
if (null !== $this->file) {
// ...
/**
* @ORMPostPersist()
* @ORMPostUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
// move() a...
/**
* @ORMPostRemove()
*/
public function removeUpload()
{
if ($file = $this->getAbsolutePath()) {
unlink($file);
}
}
}
La...
Upcoming SlideShare
Loading in...5
×

Clase 14 doctrine - subir archivos

580

Published on

www.hydrascs.com

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
580
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
13
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Clase 14 doctrine - subir archivos

  1. 1. Doctrine - Subir archivos Realizada por: Christian Aquino |@cj_aquino Diego Ramirez |@thedarsideofit Gonzalo Alonso |@GonzaloAlonsoD Diego Barros |@Inmzombie Para: Hydras C&S |@hydras_cs Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
  2. 2. Cómo manejar archivos subidos con Doctrine Puedes integrar la carga de archivos en el ciclo de vida de tu entidad (es decir, creación, actualización y eliminación). En este caso, ya que tu entidad es creada, actualizada y eliminada desde Doctrine, el proceso de carga y remoción de archivos se llevará a cabo de forma automática (sin necesidad de hacer nada en el controlador).
  3. 3. Configuración básica /** * @ORMColumn(type="string", length=255, nullable=true) */ public $path; La propiedad ruta almacena la ruta relativa al archivo y se persiste en la base de datos.
  4. 4. public function getAbsolutePath() { return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path; } El getAbsolutePath() es un método útil que devuelve la ruta absoluta al archivo
  5. 5. public function getWebPath() { return null === $this->path ? null : $this->getUploadDir().'/'.$this->path; } getWebPath() es un conveniente método que devuelve la ruta web, la cual se utiliza en una plantilla para enlazar el archivo cargado.
  6. 6. protected function getUploadRootDir() { // la ruta absoluta del directorio donde se deben // guardar los archivos cargados return __DIR__.'/../../../../web/'.$this->getUploadDir(); } protected function getUploadDir() { // se deshace del __DIR__ para no meter la pata // al mostrar el documento/imagen cargada en la vista. return 'uploads/documents'; }
  7. 7. public function uploadAction() { // ... $form = $this->createFormBuilder($document) ->add('name') ->add('file') ->getForm(); // ... } Para manejar el archivo real subido en el formulario, utiliza un campo file «virtual».
  8. 8. // src/Acme/DemoBundle/Entity/Document.php // ... class Document { /** * @AssertFile(maxSize="6000000") */ public $file; // ... } Debido a que estás utilizando la restricción File, Symfony2 automáticamente supone que el campo del formulario es una entrada para cargar un archivo.
  9. 9. <h1>Subir archivo</h1> <form action="#" method="post" {{ form_enctype(form) }}> {{ form_widget(form) }} <input type="submit" value="Upload Document" /> </form> Al escribir la plantilla, no olvides fijar el atributo enctype.
  10. 10. Subir archivo if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $document->upload(); $em->persist($document); $em->flush(); $this->redirect(...); } El método upload() tomará ventaja del objeto SymfonyComponentHttpFoundationFileUploadedFile, el cual es lo que devuelve después de que se presenta un campo file:
  11. 11. public function upload() { if (null === $this->file) { return; } $this->file->move( $this->getUploadRootDir(), $this->file->getClientOriginalName() ); $this->path = $this->file->getClientOriginalName() $this->file = null; }
  12. 12. Usando el ciclo de vida de las retrollamadas ¿Qué pasa si hay un problema al persistir la entidad? /** * @ORMEntity * @ORMHasLifecycleCallbacks */ class Document { }
  13. 13. class Document { /** * @ORMPrePersist() * @ORMPreUpdate() */ public function preUpload() { if (null !== $this->file) { // haz lo que quieras para generar un nombre único $filename = sha1(uniqid(mt_rand(), true)); $this->path = $filename.'.'.$this->file- >guessExtension(); } }
  14. 14. /** * @ORMPostPersist() * @ORMPostUpdate() */ public function upload() { if (null === $this->file) { return; } // move() automáticamente envía una excepción. $this->file->move($this->getUploadRootDir(), $this->path); unset($this->file); }
  15. 15. /** * @ORMPostRemove() */ public function removeUpload() { if ($file = $this->getAbsolutePath()) { unlink($file); } } } La clase ahora hace todo lo que necesitas: genera un nombre de archivo único antes de persistirlo, mueve el archivo después de persistirlo y elimina el archivo si la entidad es eliminada.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×