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.

Clase 14 doctrine - subir archivos

  • 1.
    Doctrine - Subirarchivos 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 archivossubidos 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() { returnnull === $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() { returnnull === $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 // ... classDocument { /** * @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 ciclode 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() */ publicfunction 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 functionremoveUpload() { 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.