0

我是 Symfony 2 的新手。如果这是一个简单的问题,请原谅我,但我就是不知道如何处理它。

我有 2 个实体,称为 Book 和 Page。

这是书实体代码的片段

/**
 * 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
 *
 * @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;

    ...
}

我目前使用 PosgreSQL 作为我的 RDBMS。

创建数据并将其保存到 Book 表中很好。但是在为页面保存数据时,我需要通过书籍 ID 使其引用一本书。这本书已经存储在数据库中。

我知道老派的方法是将书籍 ID 作为隐藏字段传递到页面表单中。我只是想知道,这是在 Symfony 中做的正确方法吗?

我尝试过的是我将 GET 请求传递给页面创建操作。类似的东西

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

Page 控制器上的适当操作是:

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. 这是处理创建与另一个实体具有一对一关系的实体的正确方法吗?
  2. 当我按照上面的方式进行操作时,似乎当我提交表单时,我不再获得图书实体。怎么了?

如果有人能指出我在创建与另一个实体具有一对一关系的实体方面的正确方向,我将不胜感激。如果代码有任何问题,有人可以指出吗?

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 回答
0

我所做的是:

为了创建与另一个实体具有一对一关系的实体,我使用 REST 方式来设计如下所示的 URL(其中 123 是 bookId)

http:sites/page/create/123

我还更改了 PageController 上的 createAction 以接收 $bookId 而不是 $request。它看起来像下面这样。

class PageController extends Controller {

    public function createAction($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())
        );
    }
}

为了让它将 $bookId 传递到我的 createAction 中,我将路由定义为:

page_create:
    pattern:  /page/create/{bookId}
    defaults: { _controller: MyBundle:Page:create }
    requirements:
        bookId: \d+

感谢 Wing 的建议。

于 2013-08-09T14:32:18.850 回答