首先:
假设我存储的产品来自供应商,该供应商为我提供了唯一的产品 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 编号不同并且可以更新。
通过这种方式,更新和创建方法的表单可以保持相同。我通常使用服务层来持久化对象,您应该按照自己喜欢的方式进行操作。