#1 Tienes que crear la Entidad, el formtype (que se genera de la entidad) y luego el controlador que sirva el form y por ultimo la ruta.
Y luego tiene unas cuantas particularidades, mira te dejo un ejemplo mio que modifiqué de la guia de gitnacho XD:
Entidad Picture;
namespace QRF\AdminBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
[b]Entity[/b]
/**
* Picture
*
* @ORM\Table()
* @ORM\Entity
* @ORM\Entity(repositoryClass="QRF\AdminBundle\Entity\PictureRepository")
*/
class Picture
{
/**
* @var string
*
* @ORM\Column(name="pic_path", type="string", length=255)
*/
private $picPath;
/**
* @var string
*
* @ORM\Column(name="pic_title", type="string", length=255, nullable=true)
*/
private $picTitle;
/**
* @var string
*
* @ORM\Column(name="pic_alt", type="string", length=255, nullable=true, nullable=true)
*
*/
private $picAlt;
/**
* @Assert\File(maxSize="6000000")
*
*/
private $picFile;
/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setPicFile(UploadedFile $picFile = null)
{
$this->picFile = $picFile;
}
/**
* Get file.
*
* @return UploadedFile
*/
public function getPicFile()
{
return $this->picFile;
}
/**
* Set picPath
*
* @param string $picPath
* @return Picture
*/
public function setPicPath($picPath)
{
$this->picPath = $picPath;
return $this;
}
/**
* Get picPath
*
* @return string
*/
public function getPicPath()
{
return $this->picPath;
}
/**
* Set picTitle
*
* @param string $picTitle
* @return Picture
*/
public function setPicTitle($picTitle)
{
$this->picTitle = $picTitle;
return $this;
}
/**
* Get picTitle
*
* @return string
*/
public function getPicTitle()
{
return $this->picTitle;
}
/**
* Set picAlt
*
* @param string $picAlt
* @return Picture
*/
public function setPicAlt($picAlt)
{
$this->picAlt = $picAlt;
return $this;
}
/**
* Get picAlt
*
* @return string
*/
public function getPicAlt()
{
return $this->picAlt;
}
public function getPicAbsoluteWebPath()
{
return null === $this->picPath
? null
: $this->getUploadRootPicDir().'/'.$this->picPath;
}
public function getWebPicPath()
{
return null === $this->picPath
? null
: $this->getUploadPicDir();
}
public function getUploadRootPicDir()
{
return __DIR__.'/../../../../web/'.$this->getUploadPicDir();
}
public function getUploadPicDir()
{
return 'bundles/adminbundle/img/Pictures/';
}
public function upload()
{
if (null === $this->getPicFile()) {
return;
}
$this -> getPicFile()->move(
$this->getUploadRootPicDir(),
$this->getPicFile()->getClientOriginalName()
);
$this->picPath = $this->getUploadPicDir().$this->getPicFile()->getClientOriginalName();
$this->picFile = null;
}
Básicamente en la entidad tienes que crearte los metodos para acceder a la ruta temporal, a la ruta web y lo necesario para pillar el archivo, una vez eso una función upload en la que combinas los métodos. En la entidad no te olvides de use Symfony\Component\HttpFoundation\File\UploadedFile;
Una vez tienes eso, te vas al formtype y te creas algo así:
FormType
class PictureType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('picFile', 'file', array('required' => true))
->add('picTitle', 'text', array('attr' => array('placeholder' => '<img> tag title property')))
->add('picAlt', 'text', array('attr' => array('placeholder' => '<img> tag alt property')))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'QRF\AdminBundle\Entity\Picture'
));
}
public function getName()
{
return 'qrf_adminbundle_picturetype';
}
}
Y en el controlador debería quedarte así:
Controller
public function uploadPicAction()
{
$picture = new Picture();
$form = $this -> createForm(new PictureType(), $picture);
if($this->getRequest()->isMethod('POST'))
{
$form->bind($this->getRequest());
if($form->isValid())
{
$picture->upload();
$em = $this -> getDoctrine() -> getManager();
$em->persist($picture);
$em->flush();
}else
{
$this->get('session')->getFlashBag()->add('fail', 'Fallo en el envío del formulario');
return $this->redirect($this->generateUrl('qrf_ruta'));
}
}
return $this->render('QRFAdminBundle:Dir:file.html.twig', array('newPicForm' => $form->createView()));
}
Fijate que una vez comprobado el isValid() del form, lo primero que hago es hacer el upload.
Y en la vista cuando crees el form acuerdate de esto te lo dejo en formato twig:
Enctype si no el fichero no se sube!
<form action="{{ path('qrf_ruta') }}" method="POST" class="add_form" {{ form_enctype(newPicForm) }}>
Espero que todo esto que te dejo (que yo me volví loquisimo para conseguir hacerlo BIEN) te sirva si tienes dudas ya sabes