User クラスに save メソッドがあります。
save メソッドで検証エラーが発生した場合、ユーザーに表示するエラーの配列を返します。ただし、これは私のコードでは次のように書かなければならないことを意味します。
if (!$user->save()) {
//display success to user
}
確かに私の save メソッドは成功時に true を返すはずです。しかし、その場合、どのようにエラーを処理すればよいでしょうか?
問題が発生した場合は、例外をスローしsave()
ます。
検証エラーの配列を提供する場合はException
、検証エラーを格納するメカニズムをサブクラス化して提供できます。
カスタム Exception サブクラスは、コードが明示的にスローする例外 (キャッチしたい) と予期しない例外 (致命的なはず) を区別するのにも役立ちます。
サブクラスは次のとおりです。
class UserException extends Exception
{
private $userMessages;
public function __construct($message = "", $code = 0, Exception $previous = null, array $userMessages = null)
{
parent::__construct($message, $code, $previous);
if ($userMessages === null) {
$this->userMessages = array();
} else {
$this->userMessages = $userMessages;
}
}
public function getUserMessages()
{
return $this->userMessages;
}
}
User
これは、で常に例外をスローする愚かなバージョンのクラスですsave()
。
class User
{
public function save()
{
$userMessages = array(
'Your password is wrong',
'Your username is silly',
'Your favorite color is ugly'
);
throw new UserException('User Errors', 0 , null, $userMessages);
}
}
使用するには:
$user = new User();
try {
$user->save();
} catch (UserException $e) {
foreach ($e->getUserMessages() as $message) {
print $message . "\n";
}
}
例外の $message に、たとえばセミコロンで区切られたメッセージのリストを設定することによって、このようなことを達成することもできます。エラータイプの定数のリストを作成し、それらをビットマスクとして組み合わせて、例外の $code に使用することもできます。これらのオプションの利点は、組み込みのメンバーを使用し、余分なものを追加しないことです。