2016-06-12 3 views
0

編集時を除き、Laravelフォーム要求で一意のフィールドを適用する最適な方法を探しています。最も明白な例は、電子メールアドレスを一度しか使用できないようにすることである。すなわち、システム内の各ユーザは一意の電子メールアドレスを必要とする。Laravel 5で編集するときのフォーム要求の一意のフィールド

これはユニークなフィールドを作ることによって、フォーム要求を使用して達成するためにストレートフォワードです:

public function rules() 
{ 
    return [ 
     'email' => ['required', 'email', 'unique:users,email'], 
    ]; 
} 

これは、必要なフィールドを作る電子メールとして検証し、ユーザーの表で、それが一意になり。新しいユーザーを作成するのに最適です。しかし、編集はどうですか?ユーザーがプロフィールを編集して同じメールアドレスをもう一度保存したいと思うのは、まったくもっともらしいことです(これは完全に有効です)。しかし、もちろん、電子メールはすでに "使用中"なので(ユーザー自身が編集しようとしているにもかかわらず)、uniqueのルールが適用されます。

'email' => ['required', 'email', 'unique:users,email,'.$userId] 

しかし、どのようにユーザーIDを取得する:

Laravelは無視するuserテーブルのIDを渡すことによって、これを回避する方法を提供していますか?ログインしたユーザーIDを取得するのは簡単ではないので、これは悪い例ですが、セッションに格納されていない他のオブジェクトはどうでしょうか? 1は、RESTを使用している場合

、そのオブジェクトのIDは、ルートを使ってURLおよび利用可能で、次のようになります。

$userId = $this->route('order'); 

しかし、これは非常に汚れているようです。オブジェクトを変更するためにRESTを使用していない他のインスタンスはどうですか? Laravel 5でオブジェクトを編集するときに、フォームリクエストで一意性をどのように強制しますか?

答えて

1

必要に応じて、異なるルールで2つのフォームリクエストを作成できます。 FormRequestがリクエストであるため、ルールを調整するためにFormRequestから情報を取得するのが面倒だとは思わないし、検証や承認を行う方法を決定するにはその情報の一部が必要な場合があります。

ルールに固有のルールを使用して、ルートパラメータを使用して一意のルールに追加するFormRequestを作成および更新するための記事があります。 asklagbox - blog - Form Request for Store and Update

HTTPメソッドを使用して、ストアまたは更新用であるかどうかを確認し、更新が発生している場合は固有ルール(Rest)に追加します。 RESTを使用していない場合は、HTTPメソッドのほかに何かをチェックして、これがストアかアップデートかを知る必要があります。必要に応じて、このメソッドを調整して、ルートパラメータの代わりに入力値をチェックして、固有のルールに追加することもできます。 FormRequestはリソースにかなり固有なので、あなたは本当に夢中になる必要はありませんし、あなたが何か他の方法で考えている可能性を考えたり、アプリケーション/ APIが一貫性を失うことがあります。

// added to base FormRequest 

protected $updateMethods = ['PUT', 'PATCH']; 

protected function appendUnique($key, $keyName = 'id') 
{ 
    if (in_array($this->method(), $this->updateMethods) && $param = $this->route($key)) { 
     if ($param instanceof Model) { 
      $rt = "{$param->getKey()},{$param->getKeyName()}"; 
     } else { 
      $rt = "{$param},{$keyName}"; 
     } 
     return ','. $rt; 
    } 
} 

その後、あなたFormRequestのルール方式の配列は、このようなものだろう:私は、これは、このような設定である理由であることが多いルートモデルバインディング(暗黙的および明示的)を使用

'email' => 'required|unique:users,email'. $this->appendUnique('user'), 

をし、私がチェックしているリソースが、経路パラメータではなく入力経由で渡されることはめったにありません。

こちらがお役に立てば幸いです。

関連する問題