2016-06-27 42 views
0

LaravelにAmazon MWSを統合しています。これまでのところ、ダッシュボードで、売り手IDと認証トークン(Amazonで提供)を入れることができるフォームを作成しました。私のコードは、このlaravelのカスタム検証

$store = StoreController::Find($id)->first(); 

$this->validate($request, [ 
'name'   => 'required|max:255', 
'merchantId' => 'required|max:255', 
'authToken'  => 'required|max:255', 
'marketplaceId' => 'required|max:255', 
]); 
$mws = new mwsController(); 
$result = $mws->checkCredentials($store); 

if ($result) { 
//credentials OK, Force Fill in database 
//OK with it 
// ALSO, I want to disable future Form Edits, any idea? 
}else{ 
//return error on form, saying Merchant ID and Auth Token pair is invalid 
//stuck at this point 
//documentation doesnt help 
} 

1のようになります。問題1:私はコード

2にコメントとして はどのようにして、カスタムエラーを返すことができます:私は資格の[OK]を

場合はフォームでの今後の編集を無効にしたいです説明

資格情報を確認してデータベースを更新すると、そのユーザーにはフォームが表示されますが、認証トークン、販売者IDまたはその他のフィールドは編集できません 形。

任意のガイドラインとヘルプは非常に感謝

答えて

2

を高く評価している私は、validateメソッドであなたの検証を続けるだろう。そうすれば、エラーレスポンスはすぐに機能します。 https://laravel.com/docs/5.0/validation#custom-validation-rules

それはこのようなものになります:どのようにバリデータを拡張するためにここに説明されて

Validator::extend('mwsToken', function($attribute, $value, $parameters) 
{ 
    // check if the token is valid an return result 
}); 

をそして、あなたは自分のコントローラでそれを使用することができます。

$this->validate($request, [ 
'name'   => 'required|max:255', 
'merchantId' => 'required|max:255', 
'authToken'  => 'required|max:255|mwsToken', 
'marketplaceId' => 'required|max:255', 
]); 

は必要ありませんif/else。すでに検証がパスされているので、トークンがそこで有効であると仮定できます。また、Validatorを正しく設定すると、エラー報告は自動的に機能します。


2番目の質問については、どういう意味ですか場合によっては編集を許可したくない場合は、フォームをレンダリングしないでください。 (お使いのコントローラで)おそらくこのような何か:

public function getEdit($id) { 
    $model = Model::findOrFail($id); 

    if ($model ->hasPropertyThatMeansNoEdit()) { 
     abort(403); 
    } 

    // build and render edit form 
} 

あなたpostハンドラで似た何かをすることを忘れないでください。ユーザーは常に悪意のあると想定します。フォームがないため、POSTリクエストを行うことができない、つまり、別のモデルの要求を操作することによって、


ご使用のアーキテクチャの最後の1つのメモです。あなたのスニペットでコントローラを直接呼び出すことに気づいた(StoreControllermwsController)。私はあなたがそれをするべきだとは思わない。コントローラはあなたの要求を処理するためにあります。再利用可能なコードブロックがある場合は、そのコードをサービスまたはコマンドに移動し、コントローラ内からそのコマンドを呼び出すことを検討してください。それはあなたのコントローラをよりクリーンに(SRP)し、それらのコマンドを後で再利用しやすくします。 APIや待ち行列のようなものなどがあります。

+1

私は、アプリケーションロジックが少しぐらついていると指摘しました。最初の '$ store = StoreController :: Find($ id) - > first();'には、コントローラのモデルロジックも含まれています。 – JasonK

+0

あなたの答えを何度も読んで最後のパラを把握しています。私はShoudがサービスとして持っていると信じていますが、同じコントローラがユーザーの要求に応じてユーザーのデータをフェッチしてモデルに送り、モデルからフェッチし、その場合、何をお勧めしますか?また、SRPをクリアしてください。正確には得られません。 –

+0

私の編集を参照してください。 –

2

docsに最初の質問に対する回答が記載されています。返信にメッセージバッグを追加するだけです。また、Laracastの初心者のチュートリアルビデオ(Jeffrey Wade著)をチェックしてみてください。本当に役に立ちます。コードは次のようになります。

public function store(Request $request, $id) 
{ 
    // ... 

    $this->validate($request, [ 
     'name'   => 'required|string|max:255', 
     'merchantId' => 'required|integer|max:255', 
     'authToken'  => 'required|string|max:255', 
     'marketplaceId' => 'required|integer|max:255', 
    ]); 

    $mws = new mwsController(); 
    if ($mws->checkCredentials($store)) { 
     // Your code here 
     return redirect('home')->with(['success' => 'Everything OK']); // Flash session 
    } 

    return redirect('home')->withErrors(['Merchant ID and Auth Token pair is invalid']); // Error bag 
} 

して表示する:

@if (session('success')) 
    <div class="positive message">{{ session('success') }}</div> 
@endif 

@if (count($errors) > 0) 
    <div class="negative message">{{ $errors->first() }}</div> 
@endif 

あなたはで動作するように何のコードか、例を与えられていないてきたので、2つ目の質問は答えることはかなり難しいですね。たぶん私は質問を理解していないが、私はあなたがmiddlewareを探していると思います。

編集:データベーステーブルに「検証」(デフォルト)という名前の列を追加し、2番目の質問に答えるために。資格情報がOKの場合は、その列を更新し、に設定します。フォームフィールドを操作するには、テンプレート内のその変数を使用します。

<input type="text" name="merchantId" {{ $validated ? '' : 'disabled' }}/> 
+0

あなたはapprorachが簡単ですが、ここではajaxコールがあるので、リダイレクトは私のために良いオプションではないかもしれません。あなたのヘルプブローに+1してください –

+0

あなたの編集された答えは、フォームが無用に提出されます) –

+0

フォーム(またはページ?)をユーザーに表示しないでください。一度認証されると、資格情報を表示するだけです。 – JasonK