0

私は Symfony 2 を初めて使用します。これが単純な問題である場合は申し訳ありませんが、対処方法がわかりません。

Book と Page という 2 つのエンティティがあります。

これは Book エンティティ コードのスニペットです

/**
 * Book
 *
 * @ORM\Table(name="`book`")
 */
class Book {

    /**
     * @var integer
     *
     * @ORM\Column(name="`id`", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="`name`", type="string", length=255, nullable=false)
     */
    private $name;

    ...
}

そして、これは私の Page エンティティのスニペットです

/**
 * Page
 *
 * @ORM\Table(name="`page`")
 */
class Page {
    /**
     * @var integer
     *
     * @ORM\Column(name="`id`", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToOne(targetEntity="Book")
     * @ORM\JoinColumn(name="`book_id`", referencedColumnName="`id`")
     */
    private $book;

    /**
     * @var string
     *
     * @ORM\Column(name="`page_number`", type="bigint", nullable=false)
     */
    private $pageNumber;

    ...
}

現在、RDBMS として PosgreSQL を使用しています。

Book テーブルにデータを作成して保存することは問題ありません。しかし、ページのデータを保存する場合は、ブック ID でブックを参照する必要があります。ブックは既にデータベースに保存されています。

古い学校の方法は、本のIDを隠しフィールドとしてPageフォームに渡すことです。これは Symfony で行う正しい方法ですか?

私が試したことは、ページ作成アクションに GET リクエストを渡すことです。の線に沿った何か

http://sites/page/create?bookId=123

そして、ページ コントローラーでの適切なアクションは次のとおりです。

class PageController extends Controller {

    public function createAction(Request $request) {

        // Check if bookId has been passed
        $bookId = $request->get('bookId');

        // Find the book by its $bookId
        $book = $this->getDoctrine()->getRepository("MyBundle:Book")->find($bookId);

        // Create new page
        $page = new Page();

        // Assign the book to the page
        $page->setBook($book);

        // Create the page form
        $pageForm = $this->createForm(
             new PageType(),
             $page
        );

        $pageForm->handleRequest($request);
        if ($pageForm->isValid()) {
            $pageData = $pageForm->getData();

            // SAVE DATA HERE

            // Redirect to index page
            return new RedirectResponse($this->generateUrl('index_page'));

        }

        // Then render to the template
        return $this->render(
            'MyBundle:Page:index.html.twig',
            array('form' => $pageForm->createView())
        );
    }
}

そして、私のページの種類は次のとおりです。

class PageType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('page_number', 'text', array(
                                                'label'    => 'Page Number',
                                                'required' => true,
                                            )
        );

        $builder->add('content', 'textarea', array(
                                                'label'    => 'Page Content',
                                                'required' => false,

                                            )
        );

        $builder->add('save', 'submit', array(
                                                'label'    => 'Save',
                                                'attr'     => array('class' => 'btn')
                                            ));


    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MyBundle\Entity\Page'
        ));
    }

    ...
}

私の問題は次のとおりです。

  1. これは、別のエンティティと 1 対 1 の関係を持つエンティティの作成に対処する正しい方法ですか?
  2. 上記の方法を実行すると、フォームを送信すると、本のエンティティが取得できなくなったようです。なにが問題ですか?

別のエンティティと 1 対 1 の関係を持つエンティティの作成に関して、誰かが私を正しい方向に向けることができれば、本当に感謝しています。コードに何か問題がある場合は、誰かが指摘してくれませんか?

4

2 に答える 2

0

あなたのコードには同じ問題があります:

(1) すべてのフォームは、基礎となるデータを保持するクラスの名前を知る必要があります(Symfony doc)

use Symfony\Component\OptionsResolver\OptionsResolverInterface;

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Acme\TaskBundle\Entity\Task',
    ));
}

(2)フォームフィールド名はエンティティフィールド名と同じでなければなりません

于 2013-07-29T13:10:00.867 に答える