Zend框架2编辑相册不起作用


Zend framework 2 edit album not working

我在编辑相册"SQLSTATE[23000]:完整性约束冲突:1048列'artist'不能为空"中得到PDOException。我调试了代码,发现在编辑表单操作运行后,所有列(id,title,artist)值都更改为插入语句中的空值,而它应该是编辑表单的 POST 值。我正在使用与 ZF2 教程相同的代码。$request->getPost() 具有正确的编辑值,但 $form->getData() 返回 (id,title,artist) 的空表单帖子值。

任何人都可以帮忙吗?

我的代码是:

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('album', array(
            'action' => 'add'
        ));
    }
    $album = $this->getAlbumTable()->getAlbum($id);
    $form  = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');
    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setInputFilter($album->getInputFilter());
        $form->setData($request->getPost());
        if ($form->isValid()) {
            $this->getAlbumTable()->saveAlbum($form->getData());
            // Redirect to list of albums
            return $this->redirect()->toRoute('album');
        }
    }
    return array(
        'id' => $id,
        'form' => $form,
    );
}

根据 ZF2 的例子,不应该是

$this->getAlbumTable()->saveAlbum($album);

而不是

$this->getAlbumTable()->saveAlbum($form->getData());

因为您已经绑定了将模型附加到窗体的$album。这基本上做了两件事

  1. 显示从该相册获取的具有唯一 ID 的初始值
  2. 验证表单后,数据将放回模型中。

试试我的建议

也许您在创建要绑定到 Form 对象的实体(模型对象)时遇到了与我相同的问题。

我犯的错误是我总是从实体的方法中提供输入过滤器的新实例

getInputFilter();

而在调用$form->isValid()之后,Zend Form实际上是在看是否有绑定到它的实体对象......如果是这样,那么它将在窗体的 $this->bindValues() 方法中调用 $entity->getInputFilter() ,并在收到 Filter 对象后,代码将返回 $filter->getValues() 以填充绑定模型。由于实体始终返回新的 InputFilter 实例,因此值自然为空/空。

对我来说,错误是在实体(模型)中写了这样的东西:

    public function getInputFilter()
    {
        return new SomeInputFilter();
    }

但实际上,我需要像这样编写方法:

    public function getInputFilter()
    {
        if(empty($this->inputFilter)){
            $this->inputFilter = new SomeInputFilter();
        }
        return $this->inputFilter;
    }

如您所见,解决方案是设置一个受保护的属性$inputFilter,并且仅当InputFilter对象为空时才使用该对象的新实例填充它。在我编码时没有彻底注意文档,并且在尝试插入记录时遇到了与您相同的问题(绑定模型中的空数据)。

希望你会发现这很有用,但是,我很抱歉浪费你的时间阅读这篇文章。 :)

PS:感谢您阅读我的回答,我知道我对这个话题的回应有点晚了,但我最近开始使用 Zend 2 Framework,我遇到了类似的问题,所以我试图分享我的 2 美分,希望尽可能以某种方式提供帮助。