2

我在我的一个项目中使用 CakePHP 2.1.3,我希望通过控制器以 JSON 格式返回模型验证错误,当我尝试通过 CakePHP 的模型属性 validationErrors 访问验证错误时,它在主要和所有其他关联时返回有效错误数组模型存在验证错误。但是,当主模型有效且关联模型存在验证错误时,它会导致无效的验证错误数组。下面是一个例子:

if ($this->request->is('post') || $this->request->is('put')) {
    if ($this->PrimaryModel->saveAll($this->request->data, array('validate' => 'first'))) {
        echo json_encode(array('success' => true));
    } else {
        $errors=array();
        $tablesToModels=$this->PrimaryModel->tableToModel; //List of table names included in the model description. Used for associations.
        foreach($tablesToModels as $tabel => $model) {
            $errors[$model]=$this->{$model}->validationErrors;
        }
        pr($errors);
        //echo json_encode(array('errors' => $errors));
    }
    exit;
}

如果主模型和关联模型存在验证错误,则上面的代码会产生以下输出:

Array
(
    [PrimaryModel] => Array
        (
            [field1] => Array
                (
                    [0] => notempty
                )

        )

    [AssociatedModel] => Array
        (
            [field1] => Array
                (
                    [0] => notempty
                )

            [field2] => Array
                (
                    [0] => notempty
                )

        )
)

当所有字段都填写在主模型中,或者主模型没有验证错误时,它会导致以下错误数组:

Array
(
    [PrimaryModel] => Array
        (
            [AssociatedModel] => Array
                (
                    [field1] => Array
                        (
                            [0] => notempty
                        )

                    [field2] => Array
                        (
                            [0] => notempty
                        )

                )

        )

    [AssociatedModel] => Array
        (
            [field1] => Array
                (
                    [0] => notempty
                )

            [field2] => Array
                (
                    [0] => notempty
                )

        )

)

我不知道为什么会发生这种情况以及我在哪里做错了什么?

这是一个编辑表单代码,以防你们需要它来整理它:

<php
    echo $this->Form->input('PrimaryModel.field1');
    echo $this->Form->input('PrimaryModel.field2');
    echo $this->Form->input('PrimaryModel.field3');
    echo $this->Form->input('PrimaryModel.field4');
    echo $this->Form->input('AssociatedModel.field1');
    echo $this->Form->input('AssociatedModel.field2');
    echo $this->Form->input('AssociatedModel.field3');
    echo $this->Form->input('PrimaryModel.field5');
?>

谢谢大家 :)

4

1 回答 1

0

控制器通常$validationErrors在渲染动作时构造属性。您应该使用 json 视图,而不是直接从控制器回显 json。让视图处理显示逻辑,在这种情况下,将结果显示为 json 而不是常规的 html。

将扩展名添加到您的路由文件中:

Router::parseExtensions('json');

然后创建一个视图,/View/Controller/json/action.ctp用您的控制器和动作名称替换“控制器”和“动作”。视图将如下所示:

echo json_encode($this->validationErrors);

您还需要在/View/Layouts/json/default.ctp.

echo $content_for_layout;

您可以像正常操作一样访问它,但使用.json扩展名,例如http://example.com/controller/action.json.

于 2012-06-13T14:23:50.717 回答