我应该如何在大型项目中返回错误(和消息)?

时间:2015-08-08 00:13:14

标签: php return

我正在写一个大型项目,这是一个我经常使用它的课程:

class Star
{
    /**
     * Add
     *
     * Add a star to something.
     *
     * @param int $ID   The ID of the thing.
     */

    function Add($ID)
    {
        if($this->Starred($ID))
            return 'You starred it already.';

        if(!$this->Existing($ID))
            return 'The one you tried to star does no longer exist.';

        $this->DB->Star($ID);

        return 'Starred successfully!';
    }
}

$Star = new Star();

但我会以不同的方式使用它,例如:单页功能

这是问题,有时,我想知道返回代码而不是消息

但是当我在单页中使用它时,我希望它返回消息,

所以,如果我将Add()函数更改为:

function Add($ID)
{
    if($this->Starred($ID))
        return 0;

    if(!$this->Existing($ID))
        return 1;

    $this->DB->Star($ID);

    return 2;
}

我现在可以在我的函数中使用它来处理错误:

/** Leaves a comment */
$Comment->Say('Hello.', $ID);

/** Auto star the post because we commented on it */
if($Star->Add($ID) == 2)
{
    /** Remove the comment because the post does no longer exist */
    $Comment->Remove('Hello.', $ID);

    return 'Sorry ; _ ;, the post does no longer exist.';
}

但是如果我需要在许多其他页面中返回消息呢?

我每次都需要编写这段代码吗?

switch($Star->Add($ID))
{
    case 0:
        return 'You starred it already.';
        break;

    case 1:
        return 'The one you tried to star does no longer exist.';
        break;

    case 2:
        return 'Starred successfully!';
        break;
}

我只是对此感到困惑,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

要直接解决您的代码,请阅读 编辑1 部分

我目前正在开展一个相当大的项目,而且我正在使用我制作的ErrorHandler课程。我发现使用通用错误处理程序类使它变得更容易。

class ErrorHandler
{
    /**
     * @var string an array containing all the errors set.
     */
    private static $errors = [];

    /**
     * Set an error.
     * 
     * @param string $error - The error message you'd like to set.
     * @return string - The error being set to $errors array.
     */
    public static function add($error)
    {
        return self::$errors[] = $error;
    }

    /**
     * Get all the errors.
     * 
     * @return boolean if the $errors array is empty it will return false, otherwise it will return the errors.
     */
    public static function get()
    {
        foreach (self::$errors as $error) {
            if (empty(trim($error)))
                return false;
        }
        return self::$errors;
    }
}

基本上我如何使用它就像这样,说我需要验证表单输入说登录,我首先检查用户是否按下了提交按钮,然后我使用{{1运行一些验证,如果失败,我使用ternary operator类。

ErrorHandler

那么底部if(isset($_POST['login'])) { $emailAddress = someValidationsHere ? doSomethingWithValidInput : ErrorHandler::add("Email field is empty or format is invalid."); $password = someValidationsHere ? doSomethingWithValidInput : ErrorHandler::add("Password field can't be empty and can't use special characters."); if(!ErrorHandler::get()) { echo User::login($emailAddress, $password, $autoLogin); } else { $errors = ErrorHandler::get(); foreach($errors as $error) { echo $error . "<br/>"; } } } 的作用是检查if statement函数是否返回ErrorHandler::get,在这种情况下无需显示错误消息您可以使用代码进展,false它将显示错误页面,这样您就可以显示多个错误并具有自定义格式。

我更喜欢这种方法,因为它更像是一个长期解决方案,因为您可能会更改ID,然后您必须完成所有代码并手动更改代码。它还为您的代码提供了某种结构,使代码保持清洁。

修改1

这堂课怎么样?您现在可以使用else值了解错误代码,并且可以使用const函数parse将错误代码添加到邮件中。此外,您的代码更容易理解和适应。

为什么会更多......

可以理解的

因为现在当您(或其他人)查看此代码时,他们会看到getMessage中的干净名称,因此const会让开发人员立即知道错误的含义。

适应?

现在您可以更改硬编码错误,无论如何都不会影响代码,因此如果将来您因为拼写错误或其他错误而希望更改错误,您可以更改数组消息。

ALREADY_STARRED_ERROR

我想认为编辑1 解决了您遇到的两个问题。

  

有时候,我想知道返回代码而不是消息,

     

但是当我在单页中使用它时,我希望它返回消息,

答案 1 :(得分:2)

将开关置于功能,如AddWithMessage

function AddWithMessage($Star)
{
  switch($Star->Add($ID))
  {
    case 0:
        return 'You starred it already.';
        break;

    case 1:
        return 'The one you tried to star does no longer exist.';
        break;

    case 2:
        return 'Starred successfully!';
        break;
  }
}

然后在您需要的任何单个页面中使用它而不是Add