【问题标题】:How do I add my message to the $errors variable in Laravel 4.2如何将我的消息添加到 Laravel 4.2 中的 $errors 变量
【发布时间】:2015-07-22 09:06:35
【问题描述】:

我尝试扩展 Laravel 4.2 验证以根据某些业务规则检查 所有 表单数据是否有效(不仅仅是某些字段)。

我无法以任何正常的方式扩展自定义验证器(太hacky或不够DRY),所以我决定在验证器成功后添加业务规则检查,然后添加我自己的错误消息并重定向。

它仍然很丑,而且不起作用,但现在如果有人告诉我如何将我的消息添加到会话中,我会很高兴。如果你想告诉我应该如何使用 Laravel 的自定义验证器,我已经包含了更多代码,这样你就可以更具体..:

$validator = Validator::make(Input::all(), $this->validationRules, $this->validationMessages);
if ($validator->fails()) {
    if (0 == $id) {
        return Redirect::route('x.create')->withErrors($validator)->withInput();
    } else {
        return Redirect::route('x.edit', $id)->withErrors($validator)->withInput();
    }
} else {
    //TESTs
    if ($this->AlreadyExists($id)) {
        $messages = new MessageBag();
        if ($request->getSession()->get('errors')){
            $messages = $request->getSession()->get('errors')->getBag('default');
        }
        $messages->add('form', 'same data already exists');

        if (0 == $id) {
            return Redirect::route('x.create')->withErrors($messages)->withInput();
        } else {
            return Redirect::route('x.edit', $id)->withErrors($messages)->withInput();
        }
    }
}

//all is ok. Save/update entity
...

设置会话的代码是检查 AlreadyExists 后的前 5 行。我从某个论坛得到它,但它似乎不能正常工作(如果我包含代码,我会得到一些“非对象”异常,所以它似乎破坏了会话对象)

我想我没有时间升级到 L5。

【问题讨论】:

  • 可能忘记在代码中包含一些会话保存机制 - 应该检查 MessageBag 类,还有 $messages = new MessageBag();可能不是正确的结构,因为可能未设置错误 - 如果失败

标签: php validation laravel laravel-4


【解决方案1】:

对于任何使用表单请求的人,我建议看看这个实现。 laravel 5.1 文档中的 formatErrors 提到了一种操纵错误显示方式的方法。我只是简单地跳进去并添加了一些代码来扩展错误。

use Illuminate\Contracts\Validation\Validator;

class ProfileChangePasswordRequest extends Request
{
    public function authorize()
    {
        if (auth()->check())
            return true;

        return false;
    }

    public function rules()
    {
        return [
            'password' => "required|confirmed|min:6"
        ];
    }

    protected function formatErrors(Validator $validator)
    {
        if ($this->isCurrentPasswordValidate()) {
            return $validator->errors()->all();
        } else {
            $validator->errors()->add('current_password', 'current password is wrong');
            return parent::formatErrors($validator);
        }
    }

    public function isCurrentPasswordValidate()
    {
        return auth()->validate(['email' => auth()->user()->email,
            'password' => $this->current_password]);
    }
}

【讨论】:

    【解决方案2】:

    我通过创建一个新的错误消息包并将其添加到重定向解决了这个问题:

    $mb = new Illuminate\Support\MessageBag();
    $mb->add("form", "same data already exists");
    ...
    return Redirect::route('x.create')->withErrors($mb)->withInput();
    

    似乎我需要为包添加完整的命名空间,但最重要的是我需要休息 :)

    验证逻辑仍然很糟糕,但现在没有时间修补它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 2019-06-04
      • 2020-09-24
      • 2015-02-23
      • 2017-01-08
      相关资源
      最近更新 更多