【问题标题】:Laravel 5.2 Displaying Validation ErrorLaravel 5.2 显示验证错误
【发布时间】:2016-05-30 17:10:49
【问题描述】:

我正在尝试使用 Laravel 的验证器来验证一个简单的表单。看起来验证工作正常,但我无法显示错误。表单和控制器如下所示。

表格

<h3>Add a New Team</h3>

<form method="POST" action="/teams">

    <input type="hidden" name="_token" value="{{ csrf_token() }}">

    <div class="form-group">
        <input class="form-control" name="team_name" value="{{ old('team_name') }}" />
    </div>

    <div class="form-group">
        <button type="submit" class="btn bg-primary">Add Team</button>
    </div>    
</form>

@if(count($errors))
    <div class="alert alert-danger">
        <ul>
            @foreach($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

控制器方法

public function store(Request $request) {

    $this->validate($request, [

        'team_name' => 'required|min:10'

    ]);

    $team = new Team;
    $team->team_name = $request->team_name;
    $team->save();

    return back();
}

如果我从路由中删除 Web 中间件组,错误会正常显示。

目前我的routes.php 文件如下所示

Route::group(['middleware' => ['web']], function () {

    Route::get('/teams', 'TeamsController@create');
    Route::post('/teams', 'TeamsController@store');

});

我该如何解决这个问题?任何帮助将不胜感激。

【问题讨论】:

    标签: php validation laravel laravel-5.2


    【解决方案1】:

    为什么在使用 laravel 5 时使用验证看起来像 laravel 4!!

    在 laravel 5 中,您首先需要创建 Request 类来处理您的验证

    php artisan make:request RequestName
    

    你会发现你在里面提出的请求类

    'app/http/Requests/RequestName.php'

    在规则函数中你可以处理你的验证

    public function rules()
        {
            return [
                // put  your validation rules here
                'team_name' => 'required|min:10'
            ];
        }
    

    终于在你的控制器中

    use App\Http\Requests\RequestName;
    
    public function store(RequestName $request) {
        Team::create($request->all());
        return Redirect::back();
    } 
    

    更多说明here

    【讨论】:

      【解决方案2】:

      我推荐你使用 Laravel Form Request 运行

      artisan make:request TeamRequest
      

      添加一些逻辑和规则

      class TeamRequest extends Request {
      
          /**
           * Determine if the user is authorized to make this request.
           *
           * @return bool
           */
          public function authorize()
          {
              return true; //you can put here any other variable or condition
          }
      
          /**
           * Get the validation rules that apply to the request.
           *
           * @return array
           */
          public function rules()
          {
              return [
                  // put  your validation rules here
              ];
          }
      
      }
      

      那么您的控制器代码将如下所示:

      public function store(TeamRequest $request)
      {
      
          $team = Team::create($request->all());
      
          return back();
      }
      

      您不再需要验证请求并将错误和其他内容重定向回来,laravel 会为您完成
      而且你的代码看起来更干净整洁,不是吗?

      【讨论】:

        【解决方案3】:

        在您的控制器中编写以下代码:

        // define rules
          $rules = array(
            'team_name' => 'required|min:10'
           );
        
        $validator = Validator::make(Input::all(), $rules);
        
        if ($validator->fails())
        {
          // something
           return Redirect::back()
                  ->withErrors($validator) // send back all errors to the login form
                  ->withInput();
        }
        else
        {
          // something
           // save your data 
           $team = new Team;
           $team->team_name = $request->team_name;
           $team->save();
        }
        

        查看文件的变化:

        @if (count($errors) > 0)
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
        

        【讨论】:

        • 试过了,没有任何改变。
        【解决方案4】:

        经过一番研究,我发现 Laravel 5.2 有一个 RouteServiceProvider,它包含所有路由的 web 中间件组。所以我不必手动将 web 中间件组添加到我的路由中。我刚刚从routes.php 中删除了它,问题就解决了。

        【讨论】:

          【解决方案5】:

          如果我从路由中删除 Web 中间件组,错误会正常显示。

          在 Laravel 5.2 中,web 中间件会自动应用于 routes.php 中的路由,因此无需再次应用 web 中间件。在RouteServiceProvidermapWebRoutes()方法中定义。

          【讨论】:

            猜你喜欢
            • 2016-08-06
            • 2016-03-28
            • 2016-05-25
            • 2016-09-12
            • 1970-01-01
            • 2016-11-30
            • 2016-08-17
            • 2018-12-05
            • 1970-01-01
            相关资源
            最近更新 更多