【问题标题】:Validation messages aren't showed on the view in Laravel验证消息不会显示在 Laravel 的视图中
【发布时间】:2017-10-02 09:00:31
【问题描述】:

我有ItemController.phpItemRequest.php.ItemController.php 负责添加项目,ItemRequest.php 负责表单验证。

ItemRequest.php我有这个规则

class ItemRequest extends Request
{
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            'title' => 'required',
            'category_id' => 'required',
        ];
    }

    public function messages()
    {
        return [
            'title.required' => 'The :attribute field is required.',
            'category_id.requred' => 'The :attribute field is required.',
        ];
    }
}

在我看来我有这个

@if($errors->has())
    <div class="alert alert-danger alert-dismissible">
        <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
        <h4><i class="icon fa fa-ban"></i> Alert!</h4>
        @foreach ($errors->all() as $error)
               {{ $error }}</br>
        @endforeach
    </div>
@endif

问题是表单没有得到任何验证。我可以单击带有空字段的提交并将它们插入数据库中。

这是来自ItemController.php的存储功能

public function store( ItemRequest $request )
{      
    $item = new Item;
    $item->title = $request['title'];
    if( empty( $request['alias']) ) {
      $request['alias'] = $request['title'];
    }
    $item->category_id = $request['category_id'];
    $item->save();
    return redirect()->route('admin.items');
}

为什么我在页面上没有收到任何消息或验证?

【问题讨论】:

  • 代码中定义的 $errors 变量在哪里?
  • 你在ItemController.php中定义了验证器函数吗?
  • 不,我没有在 ItemController 中定义这个
  • 你是如何创建ItemRequest 是用命令行吗?

标签: php validation laravel-5


【解决方案1】:

$request 是一个对象,而不是一个数组。 你的代码应该是这样的

$item = new Item;
$item->title = $request->get('title');
if( $request->has('alias') ) {
    // ??? 
    $request['alias'] = $request['title'];
}
$item->category_id = $request->get('category_id');
$item->save();
return redirect()->route('admin.items');

您也可以使用$request-&gt;has('name') 来检查字段是否已提交。但我不确定你想在 if 语句中做什么。

【讨论】:

  • 页面上仍然没有任何内容。不显示任何错误消息。
  • 但是它会在数据库中添加一些东西吗?
  • 不。没有插入任何内容
  • 然后验证工作,显示错误的视图中有问题。删除 if 语句,让它全部打印出来。
  • $request 实现数组访问
【解决方案2】:

您需要在ItemController 中定义一个验证器函数,该函数使用您定义的规则验证ItemRequest

protected function validator($data)
{
    return Validator::make($data, app(ItemRequest::class)->rules());
}

The Illuminate\Http\Foundation\FormRequest handles a failedValidation 使用视图会话中可用的 errorBag 重定向回上一个 URL。

这不是 Illuminate\Http\Request 为您处理的事情。

ItemController 中编写一个validate 方法,并在工作前将此作为store 中的前提条件。

function validate(Request $request) {
    $validator = $this->validator($request->all());
    if ($validator->fails()) {
        $this->throwValidationException(
            $request, $validator
        );
    }
}

function store(ItemRequest $request) {
    $this->validate($request);
    ...
}

【讨论】:

  • 谢谢。我已将此添加到 itemcontroller 但页面上仍然没有任何内容
  • 你需要扩展 FormRequest 而不是 Request。否则,您将需要实现一堆方法来确保正确处理失败的验证。
  • 好的,我已经把它改成class ItemRequest extends FormRequest 没有消息了。我是否需要进行其他更改?
  • 是的,您需要调用验证器来检查请求并引发必要的异常。如果您仍未在视图中收到错误消息,您可能需要考虑问题中链接到的问题@DinukaThilanga
  • 这解决了这个问题。我不明白为什么会发生这种情况以及为什么不修复。据我了解,这是 5.2 版的问题(?)...stackoverflow.com/a/34900644/8323337
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多