3

次のようなカスタムバリデータのセットアップがあります。

Validator::extend('valid_username', 'ProfileController@valid_username');

次に、検証を処理する次のメソッドがあります。ユーザー名が既に存在するかどうか、およびユーザー名に有効な文字が含まれているかどうかの両方をチェックします。

public function valid_username($attribute, $value, $parameters)
{
    $u = User::where('username', $value)->get();

    if ($u->count())
    {
        // here I would like to return "Username already taken."
        return FALSE;
    }
    else if (preg_match("/^[A-Za-z0-9@\.\-_]+$/", $value))
    {
        return TRUE;
    }
    else
    {
        // here I would like to return "Username contains invalid characters."
        return FALSE;       
    }
}

どのエラーが原因で検証が失敗したかに応じて、このバリデーターによって返されるエラー メッセージを変更したいと考えています。しかし、私はこれを行う方法がわかりません。私の言語ファイルでは、バリデータ用に次の行を設定しました。

"valid_username" => "This username is already taken or contains invalid characters."

Laravel で特定のエラー メッセージを返すことは可能ですか? または、この検証を 2 つのカスタム検証ルールに分割する必要がありますか? この場合、これは問題にならないかもしれませんが、特にデータベース アクセスが関係している場合は、Eloquent オブジェクトを 2 回インスタンス化するよりも、取得した Eloquent モデルを 1 つのバリデーターで検証することをお勧めします。

4

3 に答える 3

8

コードを調べた後、答えは「すぐに使えるものではない」です。ただし、すべてを拡張して機能させることはできます。

現時点では完全に実行する時間がありません (申し訳ありません!) プロセスは、Validator を拡張するクラスを作成し、その機能を機能させ、新しい ServiceProvider を使用して Laravel の$app['validator']ものを独自のものに置き換えることです。

そのプロセスは、もう少し具体的には、次のようになります。

<?php namespace MyLib\Validation;

class Validator extends \Illuminate\Validation\Validator {

    // Fancy validation logic to be able to set custom messages

}

次に、Factory を拡張して新しい Validator を返す必要があります。

<?php namespace MyLib\Validation;

class Factory extends \Illuminate\Validation\Factory {

    // Change this method
    /**
     * Resolve a new Validator instance.
     *
     * @param  array  $data
     * @param  array  $rules
     * @param  array  $messages
     * @return \MyLib\Validation\Validator
     */
    protected function resolve($data, $rules, $messages)
    {
        if (is_null($this->resolver))
        {
            // THIS WILL NOW RETURN YOUR NEW SERVICE PROVIDER SINCE YOU'RE
            // IN THE MyLib\Validation NAMESPACE
            return new Validator($this->translator, $data, $rules, $messages);
        }
        else
        {
            return call_user_func($this->resolver, $this->translator, $data, $rules, $messages);
        }
    }

}

...そして最後に、検証サービス プロバイダーを拡張し、新しい Factory を使用してから、既定の ValidationServiceProvider を独自のものに置き換えます。

<?php namespace MyLib\Validation;

class ValidationServiceProvider extends \Illuminate\Validation\ServiceProvider {

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->registerPresenceVerifier();

        $this->app['validator'] = $this->app->share(function($app)
        {
            // THIS WILL NOW RETURN YOUR FACTORY SINCE YOU'RE
            // IN THE MyLib\Validation NAMESPACE
            $validator = new Factory($app['translator'], $app);

            // The validation presence verifier is responsible for determining the existence
            // of values in a given data collection, typically a relational database or
            // other persistent data stores. And it is used to check for uniqueness.
            if (isset($app['validation.presence']))
            {
                $validator->setPresenceVerifier($app['validation.presence']);
            }

            return $validator;
        });
    }

}

とにかく、これは検証ライブラリを独自のコードで拡張する 1 つの方法です。独自のメッセージを追加する問題は解決しませんでしたが、コア コードを読んでその機能を追加する方法がわかれば、アプリで機能させる方法がわかります。

最後のメモ:

検証ルール内でデータベースの「もの」を使用してLaravelがどのように処理するかを確認したい場合があります-これはアプリケーションに影響を与えないかもしれませんが(大きくならない限り!) 、何らかのリポジトリパターンValidator::extend()を使用し、代わりにそれを呼び出しで使用することを検討してください。Userクラスの直接。必須ではありません。チェックアウトするためのメモです。

頑張ってください。RTFCを恐れないでください。

于 2013-08-17T00:05:54.893 に答える