这更多的是一个方法/最佳实践的问题,而不是一个特定的技术问题,所以我来找你寻求一些指导。
我的问题围绕着Zend Framework 2表单,特别是我是否应该实现一个不同的表单来插入实体和更新实体。
概述一个简化的用例。假设我的数据库中有一个产品表。每个产品都有一个作为主键的ID(product_id
)和一个名称(name
)。假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键。
现在,假设我已经实现了product_fieldset
和product_form
,它们都工作得很好。该表单允许我指定产品ID和名称,并将其存储在数据库中。但是,当用户使用表单更新产品名称,而不是插入新产品时,我不希望他们能够编辑产品ID,因为这是我的数据库主键。
我目前只能看到如何通过实现2个表单和2个字段集,在少了一个字段(产品ID)的更新场景中呈现表单。
你会如何处理这个问题?当使用服务管理器/表单管理器收回我的表单时,我无法完全理解如何/在哪里,甚至是否应该在表单中实现逻辑来处理这种情况。
:wq
首先:
假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键。
这是一个SKU编号。保留数据库管理的主键。如果存在外部标识符,请将其单独存储。
然后,我总是重用该表单进行插入和更新。当您的SKU是与主键不同的属性时,这就变得很琐碎了。代码中的一个示例,请参见此模型:
<?php
class Product
{
protected $id;
protected $sku;
protected $name;
// getters & setters here
}
class Form extends 'Zend'Form'Form
{
public function __construct()
{
$this->add(array(
'name' => 'sku',
));
$this->add(array(
'name' => 'name',
));
}
}
class Controller extends 'Zend'Mvc'Controller'AbstractActionController
{
public function createAction()
{
$form = new Form;
$product = new Product;
$form->bind($product);
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost();
$form->setData($data);
if ($form->isValid()) {
// get service to update
$service->create($product);
// redirect to view
}
}
return new ViewModel(array(
'form' => $form,
));
}
public function updateAction()
{
$form = new Form;
// Load product based on the ID
$form->bind($product);
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost();
$form->setData($data);
if ($form->isValid()) {
// get service to update
$service->update($product);
// redirect to view
}
}
return new ViewModel(array(
'form' => $form,
'product' => $product,
));
}
}
这意味着该模型始终为自己保留一个ID,并且SKU可以随时更新。更新使用请求中的id(例如,您有一个url admin/product/edit/123
),SKU编号不同,可以更新。
通过这种方式,更新和创建方法的表单都可以保持不变。我通常使用服务层来持久化对象,您应该按照自己喜欢的方式进行。