1

AbstractType(ドクトリン永続) エンティティにマップするフォーム ( ) があります。

そのエンティティは、ドクトリンのタイプのフィールドを持っていますarray

symfony のドキュメントによると、フォーム コレクション フィールドを PHP の にマップできるはずですがarray、フォームがエンティティにマップされている場合は機能しないようです。symfony はそのフィールドがリレーションであることを期待していますが、それは単にarray.

これは実際のコードではなく、単なる例です。

この (ドクトリンに固執する) エンティティを考えてみましょう:

class Article
{
   ...
    /**
     * @ORM\Column(type="array")
     */
    protected $tags;   
   ...
}

そして、このエンティティ(ドクトリンによって管理されていません):

class Tag
{
   ...
    public $name;
   ...
}

そして、このフォームタイプ:

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('tags', 'collection', array('type' => new TagType()));
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Article',
        );
    }
}

タグのフォーム タイプ:

class TagType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('name', 'text');
    }

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => '\Entity\Tag',
        );
    }
}

ArticleType 教義をインスタンス化しようとすると、次のような文句が表示されます。

Expected argument of type "\Entity\Tag", "array" given

ファイル内:

vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php 行 47

独自のフィールド タイプを記述せずに、やりたいことを実行することはできますか?

更新: 質問を言い換える必要があるかもしれません: このフィールドを何にもマップしないように symfony に指示するにはどうすればよいですか?

4

2 に答える 2

2

私は一つのことを逃した。tagsコレクションプロパティ( here )に連想配列の配列を含むフィクスチャをロードしました。Tagフィクスチャをエンティティの配列 (ここではインスタンスの配列)に変更した後、フィクスチャをリロードするのを忘れていました。

すべてが問題なく動作するようになったので、ineed symfony はフォーム コレクションをarrayおよびリレーション ( ArrayCollection) の両方にマップできます。違いは、関係の逆側を手動で永続化する必要がないことです。

だからこれは私の悪いことでした。とにかくありがとう。

于 2012-05-08T13:34:32.287 に答える
0

タイプarrayは最終的にシリアル化された文字列に変換されるため、コレクションタイプにマッピングすることは不適切です。より良い方法は、getParent'text`であるカスタムフィールドタイプを作成し、ユーザー入力を配列に、またはその逆に変換するデータトランスフォーマーを追加することです。このクックブックエントリを確認してください。

于 2012-05-07T20:23:58.763 に答える