2015-05-17 136 views
0

我有以下观点:Laravel 5验证错误

@extends('layouts.admin') 

@section('pagetitle') 
    Edit Settings 
@stop 

@section('content') 

{!! $message or '' !!} 

@if (count($errors) > 0) 
    <div class="alert alert-danger"> 
     <strong>Whoops!</strong> There were some problems with your input.<br><br> 
     <ul> 
      @foreach ($errors->all() as $error) 
       <li>{{ $error }}</li> 
      @endforeach 
     </ul> 
    </div> 
@endif 

<div class="portlet light bordered"> 

    <div class="portlet-title"> 
     <div class="caption font-red-sunglo"> 
      <i class="fa fa-tag font-red-sunglo"></i> 
      <span class="caption-subject bold uppercase">Discounts</span> 
     </div> 
    </div> 

    <div class="row"> 

     <div class="col-xs-12"> 

      <form role="form" method="POST" action="{!! URL::to('admin/discounts/update') !!}"> 
       <input type="hidden" name="_token" value="{{ csrf_token() }}"> 

       <table class="table table-bordered table-striped table-hover"> 
        <thead> 
         <tr> 
          <th width="30%">Minimum Credits</th> 
          <th width="30%">Maximum Credits</th> 
          <th width="30%">Discount %</th> 
          <th width="100"></th> 
          <th width="100"></th> 
         </tr> 
        </thead> 
        <tbody> 
         @if(count($discounts)==0) 
          <tr> 
           <td> 
            {!! Form::text('min_credits[]', null, array('class' => 'form-control')) !!} 
           </td> 
           <td> 
            {!! Form::text('max_credits[]', null, array('class' => 'form-control')) !!} 
           </td> 
           <td> 
            <div class="input-group"> 
             {!! Form::text('discount_percent[]', null, array('class' => 'form-control')) !!} 
             <span class="input-group-addon">%</span> 
            </div> 
           </td> 
           <td><button type="button" class="btn red delete"><i class="fa fa-trash"></i> Delete</td> 
           <td><button type="button" class="btn green newrow"><i class="fa fa-plus"></i> New Row</button></td> 
          </tr> 
         @else 
          @foreach($discounts as $discount) 
           <tr> 
            <td> 
             {!! Form::text('min_credits[]', $discount->min_credits, array('class' => 'form-control')) !!} 
            </td> 
            <td> 
             {!! Form::text('max_credits[]', $discount->max_credits, array('class' => 'form-control')) !!} 
            </td> 
            <td> 
             <div class="input-group"> 
              {!! Form::text('discount_percent[]', $discount->discount_percent, array('class' => 'form-control')) !!} 
              <span class="input-group-addon">%</span> 
             </div> 
            </td> 
            <td><button type="button" class="btn red delete"><i class="fa fa-trash"></i> Delete</td> 
            <td><button type="button" class="btn green newrow"><i class="fa fa-plus"></i> New Row</button></td> 
           </tr> 
          @endforeach 
         @endif 
        </tbody> 
       </table> 

       <div class="row mtop20"> 
        <div class="col-xs-12"> 
         {!! Form::submit('Update', array('class' => 'btn btn-primary')) !!} 
        </div> 
       </div> 
      </form> 
     </div> 
    </div> 
</div> 

@stop 

@section('scripts') 
    <script type="text/javascript"> 
     $(document).ready(function() { 

      $('.delete').click(function() { 
       if(confirm("Are you sure you want to delete this row?")){ 
        $(this).closest('tr').remove(); 
       } 
      }); 

      $('.newrow').click(function() { 
       html = '<tr>\ 
          <td>\ 
           {!! Form::text('min_credits[]', "", array('class' => 'form-control')) !!}\ 
          </td>\ 
          <td>\ 
           {!! Form::text('max_credits[]', "", array('class' => 'form-control')) !!}\ 
          </td>\ 
          <td>\ 
           <div class="input-group">\ 
            {!! Form::text('discount_percent[]', "", array('class' => 'form-control')) !!}\ 
            <span class="input-group-addon">%</span>\ 
           </div>\ 
          </td>\ 
          <td><button type="button" class="btn red delete"><i class="fa fa-trash"></i> Delete</td>\ 
          <td><button type="button" class="btn green newrow"><i class="fa fa-plus"></i> New Row</button></td>\ 
         </tr>'; 
       $(this).closest('tr').after(html); 
      }); 

     }); 
    </script> 
@stop 

以下请求:

<?php namespace App\Http\Requests; 

use App\Http\Requests\Request; 
use Validator; 
use Session; 
use Auth; 

class DiscountsEditRequest extends Request { 

    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Set up the validation rules 
    */ 
    public function rules() 
    { 
     $rules = [ 
      'min_credits' => 'array', 
      'max_credits' => 'array', 
      'discount_percent' => 'array' 
     ]; 

     $row_count = count($this->min_credits); 
     for($i=0; $i<$row_count; $i++) { 
      $rules['min_credits.'.$i] = 'required|integer'; 
      $rules['max_credits.'.$i] = 'integer'; 
      $rules['discount_percent.'.$i] = 'required|integer'; 
     } 

     return $rules; 
    } 

    public function messages() 
    { 
     $messages = [ 
      'min_credits.array' => 'The minimum credits field must be an array.', 
      'max_credits.array' => 'The maximum credits field must be an array.', 
      'discount_percent.array' => 'The discount percent field must be an array.', 
      'discount_percent.required' => 'The discount field is required.' 
     ]; 

     $row_count = count($this->min_credits); 
     for($i=0; $i<$row_count; $i++) { 
      $messages['min_credits.'.$i.'required'] = 'The minimum credits field is required.'; 
      $messages['min_credits.'.$i.'integer'] = 'The minimum credits field must contain an integer.'; 
      $messages['max_credits.'.$i.'integer'] = 'The maximum credits field must contain an integer.'; 
      $messages['discount_percent.'.$i.'required'] = 'The discount field is required.'; 
      $messages['discount_percent.'.$i.'integer'] = 'The discount field must contain an integer.'; 
     } 

     return $messages; 
    } 

} 

以下控制器:

<?php namespace App\Http\Controllers\Admin; 

use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use App\Http\Requests\DiscountsEditRequest; 

use Illuminate\Http\Request; 
use View; 
use Session; 
use Input; 
use Response; 
use Auth; 
use App\Discount; 

class DiscountsController extends Controller { 

    public function __construct() 
    { 
     $this->data['admin_user'] = Session::get('admin_user'); 

     $this->data['message'] = Session::get('message'); 

     $this->data['admin_user'] = Auth::user(); 
    } 

    /** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
     $this->data['discounts'] = Discount::orderBy('min_credits', 'asc')->get(); 

     return View::make('admin/discounts/index', $this->data); 
    } 

    /** 
    * Update the specified resource in storage. 
    * 
    * @param int $id 
    * @return Response 
    */ 
    public function update(DiscountsEditRequest $request) 
    { 
     Discount::truncate(); 

     $row_count = count($request->min_credits); 
     for($i=0; $i<$row_count; $i++) { 
      Discount::create([ 
       'min_credits' => $request->min_credits[$i], 
       'max_credits' => $request->max_credits[$i], 
       'discount_percent' => $request->discount_percent[$i] 
      ]); 
     } 

     Session::flash('message', '<div class="alert alert-success" role="alert">The settings have been updated.</div>'); 
     return redirect('admin/discounts'); 
    } 

} 

如果我提交表单与所有字段正确填写它工作正常,但如果我故意做一些事情,使验证失败,如提交一个min_credits字段为b平直我得到以下错误:

ErrorException in helpers.php line 455: 
htmlentities() expects parameter 1 to be string, array given (View: C:\xampp\htdocs\clipitquick\resources\views\admin\discounts\index.blade.php) 

这是一个完整的堆栈跟踪:

in helpers.php line 455 
at CompilerEngine->handleViewException(object(ErrorException), '1') in PhpEngine.php line 43 
at PhpEngine->evaluatePath('C:\xampp\htdocs\clipitquick\storage\framework\views/b9d9b3d2ce2ab48a4dd7dd16ca46f5fe', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'admin_user' => object(User), 'message' => null, 'discounts' => object(Collection))) in CompilerEngine.php line 57 
at CompilerEngine->get('C:\xampp\htdocs\clipitquick\resources\views/admin/discounts/index.blade.php', array('__env' => object(Factory), 'app' => object(Application), 'errors' => object(ViewErrorBag), 'admin_user' => object(User), 'message' => null, 'discounts' => object(Collection))) in View.php line 136 
at View->getContents() in View.php line 104 
at View->renderContents() in View.php line 78 
at View->render() in Response.php line 44 
at Response->setContent(object(View)) in Response.php line 202 
at Response->__construct(object(View)) in Router.php line 1188 
at Router->prepareResponse(object(Request), object(View)) in Router.php line 692 
at Router->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AdminAuth.php line 30 
at AdminAuth->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101 
at Pipeline->then(object(Closure)) in Router.php line 693 
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 660 
at Router->dispatchToRoute(object(Request)) in Router.php line 618 
at Router->dispatch(object(Request)) in Kernel.php line 210 
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 141 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in ShareErrorsFromSession.php line 55 
at ShareErrorsFromSession->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in StartSession.php line 61 
at StartSession->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in AddQueuedCookiesToResponse.php line 36 
at AddQueuedCookiesToResponse->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in EncryptCookies.php line 40 
at EncryptCookies->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) in CheckForMaintenanceMode.php line 42 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) in Pipeline.php line 125 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 101 
at Pipeline->then(object(Closure)) in Kernel.php line 111 
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 84 
at Kernel->handle(object(Request)) in index.php line 51 

回答

0

我不得不改变它让每一个阵列值有一个关键的设置,像这样:

@foreach($discounts as $key => $discount) 
    <tr> 
     <td> 
      {!! Form::text('row['.$key.'][min_credits]', $discount->min_credits, array('class' => 'form-control')) !!} 
     </td> 
     <td> 
      {!! Form::text('row['.$key.'][max_credits]', $discount->max_credits, array('class' => 'form-control')) !!} 
     </td> 
     <td> 
      <div class="input-group"> 
       {!! Form::text('row['.$key.'][discount_percent]', $discount->discount_percent, array('class' => 'form-control')) !!} 
       <span class="input-group-addon">%</span> 
      </div> 
     </td> 
     <td><button type="button" class="btn red delete"><i class="fa fa-trash"></i> Delete</td> 
     <td><button type="button" class="btn green newrow"><i class="fa fa-plus"></i> New Row</button></td> 
    </tr> 
@endforeach 

,然后改变,像这样的验证规则:

public function rules() 
{ 
    $rules = [ 
     'min_credits' => 'array', 
     'max_credits' => 'array', 
     'discount_percent' => 'array' 
    ]; 

    $row_count = count($this->row); 
    for($i=0; $i<$row_count; $i++) { 
     $rules['row.'.$key.'.min_credits'] = 'required|integer'; 
     $rules['row.'.$key.'.max_credits'] = 'integer'; 
     $rules['row.'.$key.'.discount_percent'] = 'required|integer'; 
    } 

    return $rules; 
} 
1

根据您的验证规则,所有的三个属性是数组。稍后,您将它们作为Form::text的值传递。让我们来看看函数声明:

string text(string $name, string $value = null, array $options = array()) 

的问题是一样的异常消息 - 你试图传递一个数组$ value参数,它仅接受字符串。

它看起来像你想为每个数组值很多领域,所以尝试这样的事:

@foreach($discount->min_credits as $entry) 
    <td> 
     {!! Form::text('min_credits[]', $entry, array('class' => 'form-control')) !!} 
    </td> 
@endforeach