Zend 框架(zf2)如何将输入值传递给模型?

Zend framework (zf2) how the input values are passed to the model?

这可能是一个关于 ZF2 的非常简单的问题,但我无法理解它。所以请多多包涵。

假设我创建了一个用户注册表单。它有 2 个输入:用户名和密码。在模型中,我创建了一个 class 用户,它有 $username 和 $password 变量,以及两个变量的 setters + getters。

我的问题是如何将用户写入 HTML 输入的内容传递给相应的设置器?显然,它与 $_POST 数组有关。但它在 ZF2 内部是如何完成的呢?我应该使用什么将用户名输入传递给实际的 $username 变量?

如果您的表单是 posting,值将存储在 post 中,输入 ID 作为键。您可以使用几种方法从那里访问它们。

$this->getRequest()

将获取所有内容,然后您可以使用 ->getParams() 获取所有 post 参数,甚至可以使用 ->getParam('username') 获取您需要的参数。

您将需要使用水化器来填充模型的数据。一个示例是 Zend\Stdlib\Hydrator\ClassMethods,它接受一个数组(例如 post 数据)并调用目标对象的设置器。

$hydrator = new \Zend\Stdlib\Hydrator\ClassMethods;
$user     = new \User\Model\User;

$data = [
   'username' => 'foo',
   'password' => 'bar',
];

$hydrator->hydrate($data, $user);

echo $user->getUsername(); // foo

但是请记住,您需要确保清理 所有 用户提供的数据(例如散列密码)以及 validate 表单数据正确(例如,确保密码的最低复杂性,或确保用户名的有效电子邮件地址)。

Zend\Form 组件旨在集成所有这些要求,并允许您构建表单 HTML 输出。您可以将 hydrator 附加到表单上,一旦经过验证,您就可以检索一个构造的实体,该实体将使用 $form->getData().

用户提供的数据进行填充
$request = $this->getRequest();

if ($request->isPost()) {

    $form->setData($request->getPost());

    if ($form->isValid()) {

        // hydration occurs internally and returns our user populated
        $user = $form->getData(); 

        if ($user instanceof User) {
            echo $user->getUsername();
        }
   }
}

ZF2 tutorial gives a detailed explanation of the process,如果您还没有创建示例项目,我强烈建议您这样做。