1

アカウント管理に関するいくつかの機能を備えたクラスがあり、メールアドレスやユーザー名などを検証するクラスもあります。

accountクラス内で検証クラスを使用するにはどうすればよいですか?簡単に含めるにはどうすればよいですか?

4

3 に答える 3

1

検証クラスをインスタンス化し、それをパラメーターとしてアカウント クラスに渡し、アカウント コンストラクター メソッドのアカウント クラス内のプロパティとして設定できますか?

于 2013-01-09T15:01:37.077 に答える
1

1 つのクラスが検証目的で特別に設計され、別のクラスがインスタンス固有の情報を含むように設計されている場合、3 つの異なるアプローチを取ることができます。

1) バリデーターを静的に参照する (推奨):

<?php
class Validation {
  public static function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
  }
}

class AccountManagement {
  public $email;
  public function __construct($email) {
    $this->email = $email;

    // Validate the e-mail. If not valid, an exception is thrown.
    if(!Validation::validateEmail($this->email)) {
      throw new InvalidArgumentException('$email argument supplied must contain a valid e-mail address');
    }
  }
}

2) 検証クラスから継承するようにインスタンス クラスを拡張します。

<?php
class Validation {
  public function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
  }
}

class AccountManagement extends Validation {
  public $email;
  public function __construct($email) {
    $this->email = $email;

    // Validate the e-mail. If not valid, an exception is thrown.
    if(!$this->validateEmail($this->email)) {
      throw new InvalidArgumentException('$email argument supplied must contain a valid e-mail address');
    }
  }
}

3) インスタンス クラス内から検証クラスをインスタンス化します (推奨されません)。

<?php
class Validation {
  public function validateEmail($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL);
  }
}

class AccountManagement extends Validation {
  public $email;
  public function __construct($email) {
    $this->email = $email;

    $validator = new Validation;

    // Validate the e-mail. If not valid, an exception is thrown.
    if(!$validator->validateEmail($this->email)) {
      throw new InvalidArgumentException('$email argument supplied must contain a valid e-mail address');
    }
  }
}

実装のテスト

ニーズに最も適した方法を選択したら (どちらを選択しても)、次のコードでテストできます。

// Valid, should not throw an exception and should print success.
try {
  $account = New AccountManagement('me@myself.com');
  print "AccountManagement object successfully instantiated.<br />\r\n";
} catch(Exception $e) {
  print 'Error: Encountered ' . $e;
}

// Invalid, should throw an InvalidArgumentException exception
try {
  $account = New AccountManagement('myself.com');
  print "AccountManagement object successfully instantiated.<br />\r\n";
} catch(Exception $e) {
  print 'Error: Encountered ' . $e;
}

ボーナスの例:

場合によっては、検証エラーを明確にキャッチし、発生する可能性のある他の例外を何かに処理させたい場合があります。この場合、バリデーター専用の特別な例外を作成し、バリデーターが例外をスローするようにすることができます。

<?php
class ValidationException extends Exception {
  // Will use default Exception behavior.
}

class Validation {
  public static function validateEmail($email) {
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      throw new ValidationException('E-mail address supplied is not valid');
    }
  }
}

class AccountManagement {
  public $email;
  public function __construct($email) {
    $this->email = $email;

    // Validate the e-mail.
    Validation::validateEmail($this->email);
  }
}

// Valid, should not throw an exception and should print success.
try {
  $account = New AccountManagement('me@myself.com');
  print "AccountManagement object successfully instantiated.<br />\r\n";
} catch(Exception $e) {
  print 'Error: Encountered ' . $e;
}

// Invalid, should throw an ValidationException exception
try {
  $account = New AccountManagement('myself.com');
  print "AccountManagement object successfully instantiated.<br />\r\n";
} catch(ValidationException $e) {
  print 'Error: Encountered ' . $e;
}
于 2013-01-09T15:03:39.907 に答える
-1

メソッドを使用して、3番目のクラス「AccountsManagementValidator」を作成できます

validate(AccountManagement): void
hasErrors(): boolean
getErrors(): List<Error>

さまざまな実装がありますが、私が説明したのは PlayFramework バリデーターの実装です。

もちろん、「バリデーター」クラスは、共通のメソッドを再利用して、電子メール、ユーザーなどを検証します...

于 2013-01-09T15:06:18.640 に答える