3

User クラスに save メソッドがあります。

save メソッドで検証エラーが発生した場合、ユーザーに表示するエラーの配列を返します。ただし、これは私のコードでは次のように書かなければならないことを意味します。

if (!$user->save()) {
   //display success to user
}

確かに私の save メソッドは成功時に true を返すはずです。しかし、その場合、どのようにエラーを処理すればよいでしょうか?

4

6 に答える 6

4

問題が発生した場合は、例外をスローし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 に使用することもできます。これらのオプションの利点は、組み込みのメンバーを使用し、余分なものを追加しないことです。

例外の詳細: http://php.net/manual/en/language.exceptions.php

于 2013-09-24T13:52:13.000 に答える