Остановка выполнения в рефакторированном php-коде? - PullRequest
0 голосов
/ 23 января 2011

Я только что переработал php-страницу, чтобы ее было легче расширять и поддерживать в будущем, и застрял на довольно простой проблеме.

Я разбил один метод на 3.

largemethod () стал примерно таким:

nowsmallmethod(){
  doSomeChecks();
  assignProduct();
  giveFeedbacktoUser();
}

Это все хорошо, проблема у меня с doSomeChecks ();

doSomeChecks(){
 if(something that shouldnt be true is true){
    return Controller->redirectBk();
 }
}

Суть проблемы в том, что Controller-redirectBk сначала перенаправляет, когда nowsmallmethod () завершен. Это означает, что пользователю назначен продукт, даже если тест не пройден. Я использую php-фреймворк под названием Silverstripe, поэтому я не могу реально изменить поведение Controller-> redirectBk (). Если бы у меня не было проверок в их собственном методе, тогда все работало бы нормально, потому что "return Controller-> redirectBk ();" остановит выполнение и перенаправит обратно. Каков лучший способ остановить выполнение в nowsmallmethod (), если тест не пройден? Я понимаю, что могу вернуть код состояния для ошибки, а затем остановить выполнение, но это кажется уродливым способом. Разве нет более элегантного способа? Другой вариант был бы, если бы я мог вернуть что-то подобное в doSomeChecks (), «return (return $ controller-> redirectBk ())», но это неверный синтаксис php и не особенно легко читается. Любая помощь будет принята с благодарностью.

Приятных выходных! ура Ник

Ответы [ 2 ]

1 голос
/ 23 января 2011

Используйте исключения для обработки подобных ситуаций:

<?php
try {
    // some code
    if (!$check) {
         throw new Exception('Check has failed!');
    }
    // code after 'throw' will not be executed
} 
catch(Exception $e) {
    //this is executed when exception is caught
}
?>

Если исключение выдается в дочернем методе, стек будет откатываться до самого первого блока try / catch.Подробнее об исключениях: http://php.net/manual/en/language.exceptions.php

Кроме того, вы можете комбинировать исключения с механизмом транзакций для обеспечения целостности базы данных.

1 голос
/ 23 января 2011
nowsmallmethod() {
  if (doSomeChecks()) {
    assignProduct();
    giveFeedbacktoUser();
  }
}

И doSomeChecks либо возвращает истину, либо ложь, в зависимости от того, произойдет ли перенаправление.

В качестве альтернативы вы можете die или throw, но я предполагаю нормальное условиебольше подходит в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...