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


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

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

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

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

您需要使用一个hydrator来填充模型的数据。Zend'Stdlib'Hydrator'ClassMethods就是一个例子,它接受一个数组(比如post数据)并调用目标对象的setter。

$hydrator = new 'Zend'Stdlib'Hydrator'ClassMethods;
$user     = new 'User'Model'User;
$data = [
   'username' => 'foo',
   'password' => 'bar',
];
$hydrator->hydrate($data, $user);
echo $user->getUsername(); // foo

请记住,您需要确保您对所有用户提供的数据(例如散列密码)以及验证表单数据的正确性(例如确保密码的最小复杂性,或确保用户名的有效电子邮件地址)进行消毒。

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教程给出了该过程的详细解释,如果您还没有创建示例项目,我强烈建议您这样做。

如果您的表单正在发布,则值将存储在以输入id作为键的帖子中。你可以用几种方法从那里访问它们。

$this->getRequest()

将得到一切,然后您可以使用->getParams()来获得所有的post参数,甚至->getParam('username')来获得您需要的参数。