Php 如何将消息添加到Laravel 4.2中的$errors变量中

Php 如何将消息添加到Laravel 4.2中的$errors变量中,php,validation,laravel,laravel-4,Php,Validation,Laravel,Laravel 4,我尝试扩展Laravel4.2验证,根据一些业务规则检查所有表单数据是否有效(不仅仅是某些字段) 我无法以任何正常方式扩展自定义验证器(要么太粗糙,要么不够干练),因此我决定在验证器成功后添加业务规则检查,然后添加我自己的错误消息和重定向 这仍然是丑陋的,它不工作,但现在我会很高兴,如果有人告诉我如何添加我的信息到会议。如果您想告诉我如何使用Laravel的自定义验证器,我将提供更多代码,以便您可以更具体地了解..: $validator = Validator::make(Input::all

我尝试扩展Laravel4.2验证,根据一些业务规则检查所有表单数据是否有效(不仅仅是某些字段)

我无法以任何正常方式扩展自定义验证器(要么太粗糙,要么不够干练),因此我决定在验证器成功后添加业务规则检查,然后添加我自己的错误消息和重定向

这仍然是丑陋的,它不工作,但现在我会很高兴,如果有人告诉我如何添加我的信息到会议。如果您想告诉我如何使用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。

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

$mb = new Illuminate\Support\MessageBag();
$mb->add("form", "same data already exists");
...
return Redirect::route('x.create')->withErrors($mb)->withInput();
似乎我需要为bag添加完整的名称空间,但最重要的是我需要rest:)


验证逻辑仍然不好,但现在没有时间去修补它。

对于任何使用表单请求的人,我建议看看这个实现。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]);
    }
}

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