2013-06-26 2 views
16

Я прочитал другие предметы, но это не решает мою проблему так:Symfony2 - массив ошибок преобразования строки

Я получил это

->add('role', 'choice', array(
       'label' => 'I am:', 
       'mapped' => true, 
       'expanded' => true, 
       'multiple' => false, 
       'choices' => array(
        'ROLE_NORMAL' => 'Standard', 
        'ROLE_VIP' => 'VIP', 
       ) 
      )) 

И все, что я делаю, я получаю эта ошибка:

Notice: Array to string conversion in C:\xampp\htdocs\xxx\vendor\symfony\symfony \src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php line 458 

в моей форме типа метод setRole даже не вызывается (если я переименовать его в какой-то мусор ошибка все еще происходит). Почему это происходит?

// EDIT

Полный трассировки стека:

in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php at line 458 - 

    */ 
    protected function fixIndex($index) 
    { 
     if (is_bool($index) || (string) (int) $index === (string) $index) { 
      return (int) $index; 
     } 

    at ErrorHandler ->handle ('8', 'Array to string conversion', 'C:\xampp\htdocs  \xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php', '458', array('index' => array())) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php at line 458 + 
at ChoiceList ->fixIndex (array()) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php at line 476 + 
at ChoiceList ->fixIndices (array(array())) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\SimpleChoiceList.php at line 152 + 
at SimpleChoiceList ->fixChoices (array(array())) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList.php at line 204 + 
at ChoiceList ->getIndicesForChoices (array(array())) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToBooleanArrayTransformer.php at line 63 + 
at ChoiceToBooleanArrayTransformer ->transform (array()) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 1019 + 
at Form ->normToView (array()) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 332 + 
at Form ->setData (array()) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper.php at line 59 + 
at PropertyPathMapper ->mapDataToForms (object(User), object(RecursiveIteratorIterator)) 
in C:\xampp\htdocs\xxx\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 375 + 
at Form ->setData (object(User)) 
in C:\xampp\htdocs\xxx\vendor\friendsofsymfony\user-bundle\FOS\UserBundle\Controller\RegistrationController.php at line 49 + 
at RegistrationController ->registerAction (object(Request)) 
at call_user_func_array (array(object(RegistrationController), 'registerAction'), array(object(Request))) 
in C:\xampp\htdocs\xxx\app\bootstrap.php.cache at line 2770 + 
at HttpKernel ->handleRaw (object(Request), '1') 
in C:\xampp\htdocs\xxx\app\bootstrap.php.cache at line 2744 + 
at HttpKernel ->handle (object(Request), '1', true) 
in C:\xampp\htdocs\xxx\app\bootstrap.php.cache at line 2874 + 
at ContainerAwareHttpKernel ->handle (object(Request), '1', true) 
in C:\xampp\htdocs\xxx\app\bootstrap.php.cache at line 2175 + 
at Kernel ->handle (object(Request)) 
in C:\xampp\htdocs\xxx\web\app_dev.php at line 29 + 
+0

просьба представить полный трассировки стека - в противном случае никто не может см., где ошибка имеет реальный источник – nifr

+0

Полная трассировка стека была предоставлена ​​ – user2394156

+0

Кстати, это происходит только тогда, когда я установил отображение true (которое сейчас) – user2394156

ответ

26

Symfony пытается преобразовать $ роль (свойство массива) в не кратен поле выбора (строка).

Там в несколько способов справиться с этой проблемой:

  1. Набор множественным к верно в вашей форме выбора виджета.
  2. Изменить отображение массива в строку для $ роли собственности в вашей организации.
  3. Если вы настаиваете на том, чтобы иметь вышеприведенные параметры без изменений, вы можете создать DataTransformer. Это не лучшее решение, потому что вы будете потерять данные, если ваш массив имеет более 1 элемента.

Пример:

<?php 
namespace Acme\DemoBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class StringToArrayTransformer implements DataTransformerInterface 
{ 
    /** 
    * Transforms an array to a string. 
    * POSSIBLE LOSS OF DATA 
    * 
    * @return string 
    */ 
    public function transform($array) 
    { 
     return $array[0]; 
    } 

    /** 
    * Transforms a string to an array. 
    * 
    * @param string $string 
    * 
    * @return array 
    */ 
    public function reverseTransform($string) 
    { 
     return array($string); 
    } 
} 

И тогда в вашем классе формы:

use Acme\DemoBundle\Form\DataTransformer\StringToArrayTransformer; 
/* ... */ 
$transformer = new StringToArrayTransformer(); 
$builder->add($builder->create('role', 'choice', array(
       'label' => 'I am:', 
       'mapped' => true, 
       'expanded' => true, 
       'multiple' => false, 
       'choices' => array(
        'ROLE_NORMAL' => 'Standard', 
        'ROLE_VIP' => 'VIP', 
       ) 
      ))->addModelTransformer($transformer)); 

Вы можете прочитать больше о DataTransformers здесь: http://symfony.com/doc/current/cookbook/form/data_transformers.html

+1

Наконец-то хороший ответ, спасибо большое !!!! – user2394156

+0

Рад, что я мог помочь :). Не могли бы вы пометить мой ответ как принятый? – gregory90

+0

Когда я получу достаточную репутацию, наверняка будет – user2394156

2

Убедитесь, что вы используете правильный тип данных в файле ORM. В этом случае ваше поле роли не может быть строковым. Это должно быть отношение «многие ко многим», массив или json_array.

Если вы выберете один из них, symfony вставляет данные без усилий или трансформатор любого типа.

E.g.:

// Resources/config/User.orm.yml 
fields: 
    role: 
     type: array 
     nullable: false 

Таким образом, он будет жить в вашей базе данных, как:

a:2:{i:0;s:4:"user";i:1;s:5:"admin";} 
0

Я просто добавить DataTransformer без изменения типа массива из моих ролей атрибутов, то я кладу это в моем UserType:

use AppBundle\Form\DataTransformer\StringToArrayTransformer; 

//... 

$transformer = new StringToArrayTransformer();  
$builder->get('roles')->addModelTransformer($transformer); 

И это работает для меня.