SlideShare una empresa de Scribd logo
1 de 15
Descargar para leer sin conexión
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
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).
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.
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
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.
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';
}
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».
// 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.
<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.
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:
public function upload()
{
if (null === $this->file) {
return;
}
$this->file->move(
$this->getUploadRootDir(),
$this->file->getClientOriginalName()
);
$this->path = $this->file->getClientOriginalName()
$this->file = null;
}
Usando el ciclo de vida de las retrollamadas
¿Qué pasa si hay un problema al persistir la entidad?
/**
* @ORMEntity
* @ORMHasLifecycleCallbacks
*/
class Document
{
}
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();
}
}
/**
* @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);
}
/**
* @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.

Más contenido relacionado

La actualidad más candente

Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Javier López
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jqueryAngelDX
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascriptguest030dc2
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascriptaitorgr
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLjubacalo
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jqueryEutobar
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSPjubacalo
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado JavascriptEl Jota
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM DoctrineDecharlas
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomjo_ram
 
Practica utilizacion de beans en jsp
Practica  utilizacion de beans en jspPractica  utilizacion de beans en jsp
Practica utilizacion de beans en jspBoris Salleg
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyJose Juan R. Zuñiga
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentaleshydras_cs
 

La actualidad más candente (20)

Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2Componentes, el arma secreta de Symfony2
Componentes, el arma secreta de Symfony2
 
Zen AJAX - Programador PHP
Zen AJAX - Programador PHPZen AJAX - Programador PHP
Zen AJAX - Programador PHP
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jquery
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTML
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSP
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
ORM Doctrine
ORM DoctrineORM Doctrine
ORM Doctrine
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcom
 
Practica utilizacion de beans en jsp
Practica  utilizacion de beans en jspPractica  utilizacion de beans en jsp
Practica utilizacion de beans en jsp
 
Como hacer un módulo para Visuse
Como hacer un módulo para VisuseComo hacer un módulo para Visuse
Como hacer un módulo para Visuse
 
Java beans en jsp
Java beans en jspJava beans en jsp
Java beans en jsp
 
Creación de Builders y DSL's con Groovy
Creación de Builders y DSL's con GroovyCreación de Builders y DSL's con Groovy
Creación de Builders y DSL's con Groovy
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
En 20 minutos ... jQuery
En 20 minutos ... jQueryEn 20 minutos ... jQuery
En 20 minutos ... jQuery
 
Taller de Jquery
Taller de JqueryTaller de Jquery
Taller de Jquery
 

Similar a Clase 14 doctrine - subir archivos

Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework SymfonyAlejandro Hernández
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datosFernando Cejas
 
As3 unidad 14 crear una aplicación air con flash y action script
As3 unidad 14 crear una aplicación air con flash y action scriptAs3 unidad 14 crear una aplicación air con flash y action script
As3 unidad 14 crear una aplicación air con flash y action scriptFrancisco Javier Arce Anguiano
 
BlackBerry DevCon 2011 - COM34
BlackBerry DevCon 2011 - COM34BlackBerry DevCon 2011 - COM34
BlackBerry DevCon 2011 - COM34Mariano Carrizo
 
TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23equipotresamp
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 
DocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlDocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlAntonio
 
Computación avanzada en java cert
Computación avanzada en java certComputación avanzada en java cert
Computación avanzada en java certMaestros Online
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxssuser2e6b96
 

Similar a Clase 14 doctrine - subir archivos (20)

Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
1 -programacion_oo
1  -programacion_oo1  -programacion_oo
1 -programacion_oo
 
Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework Symfony
 
Symfony2 - ACL
Symfony2 - ACLSymfony2 - ACL
Symfony2 - ACL
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 
As3 unidad 14 crear una aplicación air con flash y action script
As3 unidad 14 crear una aplicación air con flash y action scriptAs3 unidad 14 crear una aplicación air con flash y action script
As3 unidad 14 crear una aplicación air con flash y action script
 
2 7 ficheros_php
2 7 ficheros_php2 7 ficheros_php
2 7 ficheros_php
 
BlackBerry DevCon 2011 - COM34
BlackBerry DevCon 2011 - COM34BlackBerry DevCon 2011 - COM34
BlackBerry DevCon 2011 - COM34
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Cuentas de usuario
Cuentas de usuarioCuentas de usuario
Cuentas de usuario
 
Cuentas de usuario
Cuentas de usuarioCuentas de usuario
Cuentas de usuario
 
TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23TEMAS DE JAVA DEL 11 AL 23
TEMAS DE JAVA DEL 11 AL 23
 
Jquery parte 1
Jquery parte 1Jquery parte 1
Jquery parte 1
 
LFI & RFI
LFI & RFI LFI & RFI
LFI & RFI
 
Guiajs2
Guiajs2Guiajs2
Guiajs2
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
DocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En XmlDocumentacióN Del Sitio Web En Xml
DocumentacióN Del Sitio Web En Xml
 
Computación avanzada en java cert
Computación avanzada en java certComputación avanzada en java cert
Computación avanzada en java cert
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 

Más de hydras_cs

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOShydras_cs
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularioshydras_cs
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelohydras_cs
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twighydras_cs
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routinghydras_cs
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasoshydras_cs
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktophydras_cs
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2hydras_cs
 

Más de hydras_cs (8)

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOS
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularios
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelo
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twig
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routing
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktop
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2
 

Clase 14 doctrine - subir archivos

  • 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. 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. 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. 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. 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. 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. 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. // 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. <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. 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. 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. Usando el ciclo de vida de las retrollamadas ¿Qué pasa si hay un problema al persistir la entidad? /** * @ORMEntity * @ORMHasLifecycleCallbacks */ class Document { }
  • 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. /** * @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. /** * @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.