我是Symfony 2的新手。所以请原谅我,如果这是一个简单的问题,但我无法弄清楚如何处理它。
我有两个名为Book and Page的实体。
这是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;
...
}
我目前正在使用PosgreSQL作为我的RDBMS。
在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'
));
}
...
}
我的问题是:
如果有人可以指出我在创建与另一个实体有一对一关系的实体方面的正确方向,我将非常感激。 如果代码有任何问题,有人可以指出吗?
答案 0 :(得分:0)
您的代码有同样的问题:
(1)每个表单都需要知道包含基础数据的类的名称(Symfony doc)
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\TaskBundle\Entity\Task',
));
}
(2)表单字段名称必须与实体字段名称相同
答案 1 :(得分: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的建议。