我刚刚重构了一个php页面,以便将来稍微更容易扩展和维护,并且陷入了一个非常简单的问题。
我已将一种方法分解为3。
largemethod()已经变成这样:
nowsmallmethod(){
doSomeChecks();
assignProduct();
giveFeedbacktoUser();
}
这一切都很好,我遇到的问题是doSomeChecks();
doSomeChecks(){
if(something that shouldnt be true is true){
return Controller->redirectBk();
}
}
问题的症结在于,当nowsmallmethod()完成时,Controller-redirectBk首先重定向。这意味着即使测试失败,也会为用户分配产品。我正在使用一个名为Silverstripe的php框架,因此我无法真正改变Controller-> redirectBk()的行为。如果我没有用他们自己的方法进行检查,那么一切都会正常工作,因为“return Controller-> redirectBk();”会停止执行并重定向回来。 当测试失败时,什么是在nowsmallmethod()中停止执行的最佳方法?我意识到我可以返回错误的状态代码,然后停止执行,但这似乎是一种丑陋的方式。有没有更优雅的方式?另一种选择是如果我可以在doSomeChecks()中返回这样的东西,“返回(返回$ controller-> redirectBk())”但这不是有效的PHP语法,也不是特别容易阅读。任何帮助都将非常感激。
享受你的周末! 干杯 尼克
答案 0 :(得分:1)
nowsmallmethod() {
if (doSomeChecks()) {
assignProduct();
giveFeedbacktoUser();
}
}
doSomeChecks
根据重定向是否会发生,返回true或false。
或者,您可以die
或throw
,但我认为正常情况更适合您的情况。
答案 1 :(得分:1)
使用例外来处理这样的情况:
<?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
}
?>
如果在child方法中抛出异常,则堆栈将回滚到第一个try / catch块。详细了解例外情况:http://php.net/manual/en/language.exceptions.php
此外,您可以将异常与事务机制结合起来以处理数据库完整性。