6.2 控制器逻辑

在操作表单和模型记录时,你可以使用控制器逻辑的一个标准的模式。我们可以在博客演示示例中看到这种模式:

<?php
/**
 * @var Solar_Sql_Model_Catalog $_model A model catalog instance.
 */
public function actionEdit($id)
{
    // was an ID specified?
    if (! $id) {
        return $this->_error('ERR_NO_ID_SPECIFIED');
    }

    // fetch one blog article by ID
    $this->item = $this->_model->blogs->fetch($id);

    // did the blog article exist?
    if (! $this->item) {
        return $this->_error('ERR_NO_SUCH_ITEM');
    }

    // did the user click the save button?
    if ($this->_isProcess('save')) {
        // look for $_POST['blog'] in the request,
        // load into the record, and save it.
        $data = $this->_request->post('blog');
        $this->item->load($data);
        $this->item->save();
    }

    // get form hints from the record
    $this->form = $this->item->newForm();
}

下面我们来叙述这种模式:

  • 确保我们有足够的信息去获取一条记录(例如:主键值)。

  • 试着获取记录并确保能够找到它。

  • 通过_isProcess()方法判断当前传入的请求是否是由于按下提交按钮产生的。接着在传入的请求数据中(译者注:通常是一个数组)查找process键并检验它的值。(顺便提一下,这意味着你可以在一个动作方法中响应不同类型的按键事件:预览、保存、取消等。)

  • 从传入的请求中获取数据,把它加载到记录中并保存记录。注意,记录会自已做数据过滤(审查和验证)。如果你喜欢,你可以检查save()的返回值;如果保存成功,返回值为true,否则返回值为false

  • 最后,不管记录的状态如何,我们都请求它通过newForm()方法为您生成的一个新的表单对象。该表单对象将反映该记录的当前状态,包括记录属性的任何非法信息。

  • 如你所见,控制器不操作/处理表单对象。它只处理记录对象,然后请记录基于本身的属性生成表单对象,并且在$form中保存表单对象。