0

这更像是一个方法/最佳实践的问题,而不是一个具体的技术问题,所以我来向您寻求一些指导。

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

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

现在,假设我已经实现了 aproduct_fieldset和 a product_form,它们都运行良好。该表单允许我指定产品 ID 和名称并将其存储在数据库中。但是,当用户使用表单更新产品名称而不是插入新产品时,我不希望他们能够编辑产品 ID,因为这是我的数据库主键。

我目前只能看到如何通过实现 2 个表单和 2 个字段集在一个更少字段(产品 ID)的更新场景中呈现表单。

你会如何处理这个问题?当使用服务管理器/表单管理器拉回我的表单时,我无法完全理解如何/在哪里,或者即使我应该在表单中实现逻辑来处理这种情况。

:wq

4

1 回答 1

1

首先:

假设我存储的产品来自供应商,该供应商为我提供了唯一的产品 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 编号不同并且可以更新。

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

于 2013-07-11T15:08:15.467 回答