ZF2表单-插入和更新表单


ZF2 forms - insert and update forms

这更多的是一个方法/最佳实践的问题,而不是一个特定的技术问题,所以我来找你寻求一些指导。

我的问题围绕着Zend Framework 2表单,特别是我是否应该实现一个不同的表单来插入实体和更新实体。

概述一个简化的用例。假设我的数据库中有一个产品表。每个产品都有一个作为主键的ID(product_id)和一个名称(name)。假设我存储的产品来自一家供应商,该供应商为我提供了一个唯一的产品id,我想将其用作数据库中的主键。

现在,假设我已经实现了product_fieldsetproduct_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编号不同,可以更新。

通过这种方式,更新和创建方法的表单都可以保持不变。我通常使用服务层来持久化对象,您应该按照自己喜欢的方式进行。