【问题标题】:CRUD using form: UpdatingCRUD 使用表单:更新
【发布时间】:2018-08-10 01:45:07
【问题描述】:

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

这是错误:

表单的视图数据应该是 Symfony\Component\HttpFoundation\File\File 类的实例,但它是一个 (n) 字符串。
您可以通过将“data_class”选项设置为 null 或添加将 a(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;

【问题讨论】:

  • 你能告诉我们你的课程的导入部分吗?通常当您没有在导入部分导入适当的类时会发生此错误,symfony 会尝试自己来宾它应该使用哪个类
  • @NDZIEPatrickJoel
  • 我将您在评论部分包含的内容合并到您的问题中。
  • 能否提供您的表单类的完整代码?

标签: forms symfony file-upload crud


【解决方案1】:

根据 Symfony 文档:How to upload file,您必须将文件对象设置为 Image setter,而不是字符串。这就是您出现此错误的原因:

表单的视图数据应该是 Symfony\Component\HttpFoundation\File\File 类的实例,但它是一个 (n) 字符串。 您可以通过将“data_class”选项设置为 null 或添加将 a(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'

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

希望得到帮助,祝你有个愉快的一天!!!

【讨论】:

    【解决方案2】:

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

    public function updateAction(Request $request ,$id) { 
    
         $id->setImage( 
                new File($this->getParameter('images_directory').'/'.$id->getImage()
         ));
    

    ...

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多