CRUD使用形式:更新

时间:2018-03-01 21:33:54

标签: forms symfony file-upload crud

我按更新时出错了。
我使用相同的代码添加。
我认为可能是导致问题的图片上传。

这是错误:

  

表单的视图数据应该是Symfony \ Component \ HttpFoundation \ File \ File类的实例,但是是(n)字符串。
  您可以通过设置" data_class"来避免此错误。 null的选项或添加一个视图转换器,将(n)字符串转换为Symfony \ Component \ HttpFoundation \ File \ File的实例。

我的控制器:

public function updateAction(Request $request ,$id)
{
  $em = $this->getDoctrine()->getManager();
  $forum = $em->getRepository("ForumBundle:Forum")->find($id);
  $forum->setModifiee(new \DateTime('now'));
  $form = $this->createForm(ForumType::class, $forum);
  $form->handleRequest($request);
  if ($form->isSubmitted() && $form->isValid()) {
    $file = $form['image']->getData();
    $file->move("images/", $file->getClientOriginalName());
    $forum->setImage("images/" . $file->getClientOriginalName());
    $em->persist($forum);
    $em->flush();
    return $this->redirectToRoute('forum_show');
  }
  return $this->render("@Forum/Sujet/Update_topic.html.twig", array("form" => $form->createView()));
}

我的表格:

public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder->add('titre')
          ->add('tags')
          ->add('image', FileType::class,array('attr' => array(
                'class'=>'form-control'
              //'class'=>'btn btn-default btn-file'
          )))
          ->add('blog',TextareaType::class)
          ->add('Ajouter',SubmitType::class,array('attr' => array(
                'class'=>'theme_button color3 wide_button'
          )));
}

这些是我的包括:

namespace ForumBundle\Controller; 
use blackknight467\StarRatingBundle\Form\RatingType; 
use ForumBundle\Form\RateType; 
use ForumBundle\Entity\Commentaire; 
use ForumBundle\Entity\Forum; 
use ForumBundle\Entity\Rating; 
use ForumBundle\Form\CommentaireType; 
use ForumBundle\Form\ForumType; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\File\File;

2 个答案:

答案 0 :(得分:0)

根据Symfony文档:How to upload file,您必须将文件对象设置为图像设置器,而不是字符串。这就是你有这个错误的原因:

  

表单的视图数据应该是Symfony \ Component \ HttpFoundation \ File \ File类的实例,但是是(n)字符串。   您可以通过设置" data_class"来避免此错误。 null的选项或添加一个视图转换器,将(n)字符串转换为Symfony \ Component \ HttpFoundation \ File \ File的实例。

实现此目的的最佳方法是在控制器对象上为您的图像设置一个新的File实例,如下所示:

use Symfony\Component\HttpFoundation\File\File;
// ...

public function updateAction(Request $request, $id)
{
  $em = $this->getDoctrine()->getManager();
  $forum = $em->getRepository("ForumBundle:Forum")->find($id);
  $forum->setModifiee(new \DateTime('now'));
  $form = $this->createForm(ForumType::class, $forum);
  $form->handleRequest($request);
  if ($form->isSubmitted() && $form->isValid()) 
  {
     $file = $form['image']->getData();
     $file->move("images/", $file->getClientOriginalName());

     $forum->setImage("images/" . $file->getClientOriginalName());

     $forum->setImage(new File($this->getParameter('images_directory').'/'.$forum->getImage()));

     $em->persist($forum);
     $em->flush();
     return $this->redirectToRoute('forum_show');
  }
}

// ...

根据symfony的文档,必须在services.yml文件中设置参数images_directory

# config/services.yaml

# ...
parameters:
   # depending of your symfony version 
   images_directory: '%kernel.project_dir%/web|public/uploads/images'

另一种方法是使用上传服务或专用捆绑包,例如:VichUploaderBundleOneupUploaderBundle

希望得到这个帮助,祝你有个美好的一天!

答案 1 :(得分:0)

在updateAction中的symfony 2.8中,只需为$ id定义fileType即可 我认为它应该是这样的:

public function updateAction(Request $request ,$id) { 

     $id->setImage( 
            new File($this->getParameter('images_directory').'/'.$id->getImage()
     ));

...