PHP исключение и сообщение пользователя - PullRequest
1 голос
/ 15 октября 2011

У меня есть объект проекта. Пользователь может назначить для него рабочий объект.

99% случаев для объекта проекта установлены все необходимые поля. В некоторых случаях в проекте отсутствует поле.

Чтобы работник был назначен в проект, в проекте должны быть установлены все необходимые поля.

Чтобы решить эту проблему, я выкидываю исключения вроде этого: (не пытайтесь найти здесь образец, реальный пример более сложный)


if ($project->startDate == false ) {
  throw new Exception("Missing startDate attribute for project id: $id");
}


if ($project->finishDate == false ) {
  throw new Exception("Missing finishDate attribute for project id: $id");
}

if ($project->startDate > $project->finishDate ) {
  throw new Exception("Invalid start date for project id: $id");
}

Проблема в том, что мне нужно каждый раз отображать пользовательское сообщение. Например, если выдается первая ошибка, пользователь должен увидеть: «Пожалуйста, установите дату начала проекта» и т. Д.

Как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Просто определите свой собственный класс исключений и весь код в try .. catch:

class FormException extends Exception {
   private var $userMessage;
   public function __construct($message, $userMessage) {
     parent::__construct($message);
     $this->userMessage = $userMessage;
   }
   public function getUserMessage() {return $this->userMessage;}
}

try {
  // Whole code goes here, probably a function call
  throw new FormException("Missing startDate attribute for project id: $id",
                          'Please setup the project start date');
} catch (FormException $e) {
  echo $e->getUserMessage();
  error_log($e->getMessage());
}

Кстати, если вы хотите включить переменное содержимое в строку, либоиспользуйте двойные кавычки ("id: $id") или конкатенацию ('id: ' . $id).

1 голос
/ 15 октября 2011

Попробуйте это:

try
{
  $Message = '';
  if ($project->startDate == false ) {
    $Message = "Please setup the project start date\n";
    throw new Exception("Missing startDate attribute for project id: $id");
   }


   if ($project->finishDate == false ) {
     $Message = "Please setup the project finish date\n";
     throw new Exception("Missing finishDate attribute for project id: $id");
   }

   if ($project->approved == false ) {
     $Message = "Please setup the project approved field\n";
     throw new Exception("Missing approved attribute for project id: $id");
   }
}
catch(Exception $Ex)
{
   // Log in some way you like the $Ex-getMessage();
   echo nl2br($Message);
}
0 голосов
/ 15 октября 2011

Внутри вашего класса проекта создайте новый метод, который вероятно называется getErrorMessage.

Эта функция должна выполнять проверки (нет необходимости иметь конкретный способ проверки вне проекта или создавать объект проверки для проекта). Тогда:

if ($message = $project->getErrorMessage())
{
    throw new Exception(sprintf('%s (project id: %d)', $message, $id));
}

Если вы решите не генерировать исключения из соображений дизайна, это все еще полезно.

Вы получаете больше гибкости с помощью объекта валидатора, который, естественно, может предоставить более подробную информацию, чем один метод. Так что это может быть лучше:

class ProjectValidator
{
    private $project;
    private $errors;
    public function __construct($project)
    {
        $this->project = $project;
    }
    public function isValid()
    {
        // run your checks, add errors to the array as appropriate.

        $errors = array();

        if (!$this->project->startDate)
        {
            $errors[] = 'Missing startDate attribute';
        }

        if (!$this->project->finishDate)
        {
           $errors[] = 'Missing finishDate attribute';
        }

        if (!$this->project->approved)
        {
            $errors[] = 'Missing approved attribute';
        }

        $this->errors = $errors;

        return (bool) count($this->errors);
    }
    public function getErrors()
    {
        return $this->errors;
    }
}

$validator = new ProjectValidator($project);
if (!$validator->isValid())
{
    // throw an exception or do whatever you want in case it's not valid

    $errors = $validator->getMessages();
    $message = sprintf("Project id: %d has the following %d error(s):\n", $id, count($errors));        
    foreach($errors as $index => $error)
    {
        $message .= sprintf("%d. %s\n", $index+1, $error);
    }

    throw new Exception($message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...