2016-02-25 13 views
1

所以我試圖儲存我的hiddenType實體之一的ID和我得到:Symfony的hiddenType

表單的視圖的數據類型應爲標量,數組或\ ArrayAccess的一個實例,但是AppBundle \ Entity \ Users類的一個實例。您可以通過將「data_class」選項設置爲「AppBundle \ Entity \ Users」或添加一個將AppBundle \ Entity \ Users類的實例轉換爲標量,數組或實例\ ArrayAccess的視圖轉換器來避免此錯誤。

data_class:「此選項用於設置適當的數據映射到由所述形式使用,所以可以將其用於需要的對象任何形式的字段類型。」

看到:http://symfony.com/doc/2.7/reference/forms/types/form.html#data-class

,所以我解決我的形式:

$builder 
    ->add('user', 'hidden', array(
     'data_class' => 'AppBundle\Entity\User', 
    )); 

當我嘗試這方面,我得到一個異常,指出

,所以我實現我的實體不能轉換成字符串我的實體上的__tostring魔術方法返回實體的id,然後小枝能夠將實體ID置於隱藏字段值中

t當我嘗試提交表單時,我得到:

可捕獲的致命錯誤:參數1傳遞給AppBundle \ Entity \ Students :: setUser()必須是AppBundle \ Entity \ Users的一個實例, /vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php上線442和定義

所以它不能夠從請求字符串值拉回到實體在我的形式使用。

是的,我已經看到了使用變換器構建entityHiddenType的實現。

但是我問的是這可能使用交響樂提供的data_class設置,因爲我相信這是解決此問題的預期方法?

我只是想知道是否可以使用data_class而不是變壓器來實現。以及哪種方法是最佳實踐。

+0

「於是,我就來存儲我在hiddenType實體之一的ID」這走錯了路。請告訴我們爲什麼要這樣做,或者甚至更好,你試圖完成什麼? –

+0

@Frankbeen,他想通過使用它的ID作爲參考來存儲表單中的原則對象,然後他希望在提交表單後返回對象。這應該不使用變壓器來完成。 – Karolis

回答

0

我有同樣的問題,我解決它通過設置data_classnull我在我的HiddenType

<?php namespace AppBundle\Forms\Signup; 


use AppBundle\Entity\Course; 
use AppBundle\Repository\CourseRepository; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\CallbackTransformer; 
use Symfony\Component\Form\Extension\Core\Type\HiddenType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class PreselectedCourseType extends AbstractType 
{ 
    private $courseRepository; 

    public function __construct(CourseRepository $courseRepository) 
    { 
     $this->courseRepository = $courseRepository; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $selectedCourse = $options['selected_course']; 

     $builder 
      ->add("course", HiddenType::class,['data' => $selectedCourse, 'data_class' => null]); 


     $builder->get("course")->addModelTransformer(new CallbackTransformer(
      function (Course $course = null) {return $course? $course->getId():0;}, 
      function ($course = null) {return $this->courseRepository->getCourse($course);} 
     )); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults([ 
      'data_class' => CourseDTO::class, 
      'label' => false, 
      'selected_course' => 0 
     ]); 
     $resolver->setRequired("selected_course"); 
    } 
}