私は他の主題を読みましたが、それは私の問題を解決しないので:
私はこれを持っています
->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メソッドが呼び出されることすらありません(名前をゴミに変更しても、エラーが発生します)。なんでこんなことが起こっているの?
//編集
完全なスタックトレース:
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 +
Symfonyは$ role(arrayプロパティ)を not multiple choice field(string)に変換しようとしています。
この問題に対処するにはいくつかの方法があります。
例:
<?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
ORMファイルで適切なデータ型を使用していることを確認してください。この場合、ロールフィールドを文字列にすることはできません。多対多の関係、配列またはjson_arrayである必要があります。
それらのいずれかを選択すると、symfonyは簡単にデータを挿入します。
例えば。:
// Resources/config/User.orm.yml
fields:
role:
type: array
nullable: false
だから、それはあなたのデータベースに次のように住んでいます:
a:2:{i:0;s:4:"user";i:1;s:5:"admin";}
自分のロール属性の配列タイプを変更せずにDataTransformerを追加するだけで、これを自分のUserTypeに配置します。
use AppBundle\Form\DataTransformer\StringToArrayTransformer;
//...
$transformer = new StringToArrayTransformer();
$builder->get('roles')->addModelTransformer($transformer);
そしてそれは私のために働きます。
私はあなたの問題を持っています..私はこの解決策でこれを解決しました。お役に立てば幸いです
このコードはログインおよび登録フォームで機能します...
ユーザーエンティティ
class User {
/**
* @ORM\Column(type="array")
*/
private $roles ;
public function getRoles()
{
$roles = $this->roles;
var_dump($roles);
if ($roles != NULL) {
return explode(" ",$roles);
}else {
return $this->roles;
}
}
public function setRoles($roles)
{
$this->roles = $roles;
}
ユーザータイプ
->add('roles', ChoiceType::class, array(
'attr' => array(
'class' => 'form-control',
'value' => $options[0]['roles'],
'required' => false,
),
'multiple' => true,
'expanded' => true, // render check-boxes
'choices' => [
'admin' => 'ROLE_ADMIN',
'user' => 'ROLE_USER',
]
))