【问题标题】:Object returning an extra NULL array inside对象内部返回一个额外的 NULL 数组
【发布时间】:2018-02-28 17:24:08
【问题描述】:

所以我用 Slim 框架构建了一个简单的 API,同时使用一个中间件从这里 https://github.com/Respect/Validation 通过本指南中的一个函数进行验证:

https://www.codecourse.com/lessons/slim-3-authentication/769
https://www.codecourse.com/lessons/slim-3-authentication/770

一切似乎都很好,除了一件特定的事情:

通过本指南,我应该能够验证我的表单及其输入,然后在我的 Twig 页面上打印这些错误,例如通过这样做{{ errors | json_encode }}(用于测试),问题是即使验证功能本身有效因为它总是返回null,所以我似乎无法得到错误。

通过使用var_dump,我注意到存在“错误”,但格式似乎与指南视频中显示的格式有点不同,因为在我的 var_dump 中似乎有一个额外的数组? (不确定)显示NULL,然后只有其他数组包含这些错误,所以我认为这就是它不起作用的原因?

这是我在 var_dump 时得到的示例:

object(App\Validation\Validator)#79 (2) { ["errors":protected]=> NULL [""]=> array(1) { ["uniquevisitors"]=> array(2) { [0]=> string(30) "Uniquevisitors must be numeric" [1]=> string(31) "Uniquevisitors must be positive" } } }

那是我用 get_object_vars var_dump 的时候:

array(1) { [""]=> array(1) { ["uniquevisitors"]=> array(2) { [0]=> string(30) "Uniquevisitors must be numeric" [1]=> string(31) "Uniquevisitors must be positive" } } }

我认为{ ["errors":protected]=> NULL [""]=> 不应该在那里。 我的代码与该指南中的代码完全相同,但它为他产生的结果略有不同。关于 'uniquevisitors' 的错误应该是这样,但我认为 null 不应该在那里,我认为这可能是我的 Twig 模板无法读取它并且总是显示null 的原因,但我可能错了。

在该中间件中使用全局和/或会话是否有问题? JFYI 我也使用其他中间件,但是自从我添加它以来就是这样,以防万一我在另一个“干净”的苗条上再次运行它并获得相同的输出。当我进行一些研究时,我发现一个问题完全相同但没有答案的案例,所以我相信代码可能有问题?或者也许与我的环境有关?我使用 xampp 在本地运行它。


中间件.php

<?php

namespace App\Middleware;

class Middleware {
    protected $container;

    public function __construct($container) {
        $this->container = $container;
    }
}

ValidationErrorsMiddleware.php

<?php

namespace App\Middleware;

class ValidationErrorsMiddleware extends Middleware {
    protected $container;

    public function __invoke($request, $response, $next) {
        if (isset($_SESSION['errors'])) {
        $this->container->view->getEnvironment()->addGlobal('errors', $_SESSION['errors']);
        unset($_SESSION['errors']);
    }
        $response = $next($request, $response);
        return $response;
    }
    }

验证器.php

<?php

namespace App\Validation;

use Respect\Validation\Validator as Respect;
use Respect\Validation\Exceptions\NestedValidationException;

class Validator {

protected $errors;

    public function validate($request, array $rules) {

        foreach($rules as $field => $rule) {
            try {
                $rule->setName(ucfirst($field))->assert($request->getParam($field));
            } catch (NestedValidationException $e) {
                $errors='';
                $this->$errors[$field] = $e->getMessages();
            }
        }
        $_SESSION['errors'] = $this->errors;
        return $this;
    }
    public function failed(){
        $errors='';
        return !empty($this->$errors);
    }
}

由于某种原因,当我想使用 {{ errors.field }} 在 Twig 表单中分别发布这些错误时,它会保持空白或为空,(与 errors | json_encode 相同,它保持空)。验证本身有效,var_dump 表明存在这些错误,但由于某种原因我无法将它们发布在 twig 上,我认为这是因为我的“错误”包含一些不应该存在的额外 Null。

我使用的代码与我在第一篇文章中提到的那个指南上的代码相同,它似乎适用于这个人,但不适用于我。

【问题讨论】:

  • 不知道为什么要用twig 重新标记这个问题,因为这与twig 无关。
  • 请显示一些实际代码。 minimal reproducible example 会很棒。
  • @jmattheis 不确定当我发布“回答”类型的消息时您是否收到通知,所以以这种方式 ping 您以防万一,谢谢!
  • @user3540359 ... 是的,但这与twig 本身无关。twig 不是你的errors 变量不正确的问题
  • @DarkBee 你知道那个错误变量到底有什么问题吗?我不确定那里有什么问题

标签: php api twig slim


【解决方案1】:

您的验证器有一些问题,此时您正试图将错误分配给动态属性$errors

$errors = '';
$this->$errors[$field] = $e->getMessages();

大致“翻译”这意味着,将$e-&gt;getMessages() 的输出添加到属性$this-&gt;{empty string},因为$errors 被定义为"",这就是您使用@ 的“奇怪”输出的原因987654327@

你真正要找的是这个,

$this->errors[$field] = $e->getMessages();

validate 函数也是如此

public function failed(){
    return !empty($this->errors); //and not $this->$errors
}

【讨论】:

  • 你是说 $errors = '';负责休息?我之前也想过这个问题,但即使没有它,我也面临同样的问题,实际上最初我什至没有它,但添加了它,因为有时代码会在这个错误之外抛出“未定义的变量”错误。删除错误字符串后它仍然是一样的。
  • 因此我写了$this-&gt;errors 而不是$this-&gt;$errors,这确实会在省略$errors = ''; 时导致该通知
  • 我之前就知道,但现在已经确认了——我很笨。现在可以了,非常感谢队友:)
猜你喜欢
  • 2016-10-24
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2020-06-29
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多