Zend快速入门指南 - 创建模型 - 为什么我们需要这个setOption方法?

时间:2011-04-25 16:34:59

标签: zend-framework model

从这里的文档: http://framework.zend.com/manual/en/learning.quickstart.create-model.html

我们可以看到:

// application/models/Guestbook.php

class Application_Model_Guestbook
{

    protected $_comment;
    protected $_created;
    protected $_email;
    protected $_id;


    public function __construct(array $options = null)
    {
        if (is_array($options)) {

            $this->setOptions($options);
        }

    }


    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {

            throw new Exception('Invalid guestbook property');
        }

        $this->$method($value);
    }


    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid guestbook property');

        }
        return $this->$method();
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

... following getters and setters...

我不明白而且没有解释(也许是因为它很容易),它做了什么,为什么我们需要 setOptions 方法?

我正在尝试遵循本指南,但我不能盲目地粘贴代码而不知道它存在的原因。我会对只包含getter和setter的模型感到满意,但是,如果我不使用这个setOptions方法,也许这一切都行不通。我很担心,因为我在构造函数上看到了这一点,所以它必须以某种方式重要。

任何人都可以帮我解决,如果我们真的需要这个,如果是的话,那是什么意思?

提前致谢。

2 个答案:

答案 0 :(得分:3)

这只是各种ZF组件使用的模式。

您可以为许多组件的构造函数提供配置数组(选项)。通常,此类可配置组件的API包含一个setOptions方法,就像您在那里看到的那样。

这仅仅是快速入门的指南。我个人不遵循它,因为我认为模型应该遵循更多任务/特定于域的界面 - 例如,在我看来,留言板模型应该只接受构造函数中的特定事物,例如留言簿的所有者或这样,并且不允许“通用”选项列表。

答案 1 :(得分:3)

IMO最好采用这种方法,因为你可能会得到一系列“事物”(比如......来自形式),而不是离散变量。它的IMO更好,使用更具可读性

$this->setOption($form->getValues());

然后逐个调用

$data = $form->getValues();
$this->setName($data['name']);
$this->setSurname($data['surname']);
// ....

但是这个方法应该位于由Application_Model_Guestbook扩展的某个父类中,这是我猜测的,超出了guickstart的范围。当数组中的选项缺少setter时,提出某种通知也可能是一种好习惯。