2016-04-12 14 views
1

私は単純なクイズのアプリを持っています。Laravel - ユニークなルールの検証 - getMessagesが存在しません

質問は一意にする必要があります。

私は検証メソッド

// model 
class ChallengeQuests extends Model 
{ 
    // 
    protected $table = 'challengequests'; 
    protected $fillable=[ 
     'challenge_id', 
     'question_id' 
    ]; 

    public static function validate($input) { 
     $rules = array(
      'challenge_id' => 'Required|Integer', 
      'question_id' => 'Required|Integer|Unique:questions,id' 
     ); 

     return Validator::make($input, $rules); 
    } 
} 

を持って「ストア」に以下のコードのデータ私のモデルでは

$v = ChallengeQuests::validate(Input::all()); 

     if ($v->passes()) { 
      print 'validate passed'; 
      $record = ChallengeQuests::create(array(
       'challenge_id'=> (int) Input::get('challenge_id'), 
       'question_id'=> (int) Input::get('question_id') 
      )); 
      $record->save(); 
      return redirect()->to($url['redirects_to']); 
     } else { 
      print 'error'; 
      print_r($v->getMessages()); 
      return Redirect::to('/')->withErrors($v->getMessages()); 
     } 

を持っているしかし、私は自分のコードを実行すると、Laravelは

BadMethodCallException in Validator.php line 3016: 
Method [getMessages] does not exist. 
を不平を言います

私はquestion_idが一意であるようにしたいと思います。

私は間違っていますか?

編集:

私が使用しています:

use Illuminate\Support\Facades\Validator; 
use Illuminate\Support\Facades\Input; 

スタックトレースを:

BadMethodCallException in Validator.php line 3016: 
Method [getMessages] does not exist. 
in Validator.php line 3016 
at Validator->__call('getMessages', array()) in ChallengeQuestionsController.php line 78 
at ChallengeQuestionsController->store(object(Request)) 
at call_user_func_array(array(object(ChallengeQuestionsController), 'store'), array(object(Request))) in Controller.php line 80 
at Controller->callAction('store', array(object(Request))) in ControllerDispatcher.php line 146 
at ControllerDispatcher->call(object(ChallengeQuestionsController), object(Route), 'store') in ControllerDispatcher.php line 94 
at ControllerDispatcher->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102 
at Pipeline->then(object(Closure)) in ControllerDispatcher.php line 96 
at ControllerDispatcher->callWithinStack(object(ChallengeQuestionsController), object(Route), object(Request), 'store') in ControllerDispatcher.php line 54 
at ControllerDispatcher->dispatch(object(Route), object(Request), 'App\Http\Controllers\ChallengeQuestionsController', 'store') in Route.php line 174 
at Route->runController(object(Request)) in Route.php line 140 
at Route->run(object(Request)) in Router.php line 724 
at Router->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102 
at Pipeline->then(object(Closure)) in Router.php line 726 
at Router->runRouteWithinStack(object(Route), object(Request)) in Router.php line 699 
at Router->dispatchToRoute(object(Request)) in Router.php line 675 
at Router->dispatch(object(Request)) in Kernel.php line 246 
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44 
at CheckForMaintenanceMode->handle(object(Request), object(Closure)) 
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 124 
at Pipeline->Illuminate\Pipeline\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32 
at Pipeline->Illuminate\Routing\{closure}(object(Request)) 
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102 
at Pipeline->then(object(Closure)) in Kernel.php line 132 
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99 
at Kernel->handle(object(Request)) in index.php line 53 
at require_once('/Applications/XAMPP/xamppfiles/htdocs/laravel/scquiz/public/index.php') in server.php line 21 
+0

エラーのスタックトレース全体を投稿してください。 – Bogdan

+0

要求通りにスタックトレースを追加 – zardon

答えて

3

検証メッセージを取得するために使用正しい方法はgetMessages()ではありません、それはそう、messages()ですあなたのコードは次のようになります:

return Redirect::to('/')->withErrors($v->messages()); 

また、Laravel 5を使用している場合は、達成しようとしているのと同じことをより良い方法で行い、別のレイヤーで検証を処理して、あなたのためにエラーとページのリダイレクトを渡す気に。あなたのケースでフォームリクエストを使用することにより


、制御方法はこれに減少するであろう:ルールおよび検証ので

public function store(ChallangeQuestsFormRequest $request) 
{ 
    ChallengeQuests::create($request->only('challenge_id', 'question_id')); 

    return redirect()->to($url['redirects_to']); 
} 

ならびにエラーの場合のリダイレクトは、処理されますChallangeQuestsFormRequestクラスによって。また、createを使用してモデルエントリを作成すると、自動的にエントリが保存されるため、createの結果にsaveを使用する必要はありません。

+0

あなたの解決策が動作し、私は 'print_r'を介してメッセージを生のまま出力することができました。私はLaravelをまだ学んでいるので、Form Request Validationは私にとっては多分かもしれないと思います。私は、エラーメッセージを表示するページを取得することができませんでしたが、私はフラッシュメッセージを介してこれを解決することができると思う。 – zardon

+0

フォームリクエストは複雑ではなく、コントローラメソッドにパラメータとして(私の答えに示されているように)注入し、ルールを含み、検証を処理するクラスに過ぎません。検証が成功するとコントローラメソッドコードが実行され、エラーが発生した場合はフォームにリダイレクトされ、エラーが{{$ errors}}変数にビューに表示される配列として追加されます。もしあなたが時間があれば、私はリンク先のドキュメントを少なくとも読んでおいてほしいと提案します。それはほんの数段であり、最初からそれを掛けるかもしれないからです。 – Bogdan

+0

また、Laravelには 'dump'というヘルパー関数があります。これは' print_r'と似ていますが、正しい字下げと色で出力をうまくフォーマットします。 – Bogdan

関連する問題