6

新しいユーザーを作成する際の検証には、次のルールを使用します。

protected $rules= [
    'name'    => 'required',
    'email'    => [
        'required',
        'unique:user',
        'email'
    ]
];

既存のユーザーを更新する場合、上記と同じルールセットを使用しますが、ユーザーがメールをまったく変更していない場合に検証エラーが発生することは望ましくありません。

現在、次を使用してこれを解決しています。

if (!User::changed('email')) {
    unset($user->email);
}

私には汚い回避策のように感じるので、より良い代替手段があるかどうか疑問に思っていました.

changedまた、メソッドは私が自分で書いたものであることにも注意してください。モデルのプロパティが変更されたかどうかを確認するためのネイティブの Laravel 4 メソッドがあるかどうかは誰にもわかりませんか?

ありがとう!

4

6 に答える 6

4

1 つのアプローチは、モデルで検証関数を作成し、入力、シナリオ、および ID (無視する) を渡すコントローラーで呼び出すことです。

public function validate($input, $scenario, $id = null)
{
    $rules = [];

    switch($scenario)
    {
        case 'store':
            $rules   = [
                'name'     => 'required|min:5|unique:users',
                'email'    => 'required|email|unique:users',
                'password' => 'required|min:4|confirmed'
            ];
            break;

        case 'update';
            $rules   = [
                'name'     => 'required|min:5|unique:users' .',name,' . $id,
                'email'    => 'required|email|unique:users' .',email,' . $id,
                'password' => 'min:4|confirmed'
            ];
            break;
    }

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

次に、コントローラーで:

    $input      = Input::all();
    $validation = $user->validate($input, 'update', $user->id);

    if ($validation->fails())
    {
        // Do stuff
    }
    else
    {
        // Validation passes
        // Do other stuff
    }

他の人が述べたように、一意のルールの 3 番目のパラメーターは、無視する ID を指定します。「ログイン」などの他のケースを追加して、検証関数を再利用できます。

または、Tuts Premiumの Jeffrey Wayが「What's New In Laravel 4」という優れた一連のレッスンを提供しています。これには、サービスとリスナーを使用して検証を処理するための他のいくつかのアプローチが含まれています。

于 2013-08-06T05:01:48.447 に答える
1

2014-01-14 の時点で、属性を使用できますsometimes。Taylor が 2 日前に Laravel 4.1 に追加したと思います

$v = Validator::make($data, array(
    'email' => 'sometimes|required|email',
));

sometimes入力が存在する場合にのみ検証します。挿入のデフォルト値がない場合、これは正確なシナリオに適合する場合と適合しない場合があります。

http://laravel.com/docs/validation#conditionally-adding-rules

于 2014-01-14T12:02:54.723 に答える
0

このようなことはバリデータ関数で処理します。私のバリデータ配列はクラス変数として設定されています。次に、次のようなことを行います。

public function validate() 
{
    //exclude the current user id from 'unqiue' validators
    if( $this->id > 0 )
    {
        $usernameUnique = 'unique:users,username,'.$this->id;
        $emailUnique = 'unique:users,email,'.$this->id;
        $apiUnique = 'unique:users,api_key,'.$this->id;
    }
    else
    {
        $usernameUnique = 'unique:users,username';
        $emailUnique = 'unique:users,email';
        $apiUnique = 'unique:users,api_key';
    }

    $this->validators['username'] = array('required', 'max:32', $usernameUnique);
    $this->validators['email'] = array('required', 'max:32', $emailUnique);
    $this->validators['api_key'] = array('required', 'max:32', $apiUnique);

    $val = Validator::make($this->attributes, $this->validators);

    if ($val->fails())
    {
        throw new ValidationException($val);
    }
}
于 2013-07-09T18:52:12.293 に答える