【发布时间】:2013-11-05 19:18:47
【问题描述】:
我搜索了有关使用 PDO 处理异常的最佳实践,但大多数示例仅从简单的一类方法来看。
如果我在 ORM 类型模型中使用控制器和 repo,那么各种 try/catch 和 throw 块应该发生在哪里?
一个简化的例子:
CONTROLLER:(创建 repo 对象,触发 loadProduct 方法,并加载模板)
class ProductController {
public function viewProduct($product_id) {
$ProductRepository = new ProductRepository($this->Pdo);
$Product = $ProductRepository->loadProduct($product_id);
include(__DIR__.'/../templates/product_template.php');
}
}
模型/存储库:
class ProductRepository
{
private $Pdo;
public function __construct(PDO $Pdo)
{
$this->Pdo = $Pdo;
}
public function loadProduct($product_id,$withimages=0)
{
$Stm = $this->Pdo->prepare('
SELECT p.product_id,p.model,p.price,p.prodinfo,pi.image_path
FROM products p LEFT JOIN product_images pi
ON p.product_id = pi.product_id
WHERE p.product_id = :product_id
AND pi.is_primary = 1
');
$Stm->bindParam(':product_id',$product_id,PDO::PARAM_INT);
$Stm->execute();
return $this->arrayToObject($Stm->fetch(PDO::FETCH_ASSOC));
}
}
是否应该将 try/catch 块放入控制器中,如果 execute() 没有返回任何内容,则抛出异常?如果$Pdo->prepare() 方法没有触发,则抛出一个单独的异常?
【问题讨论】:
-
你想要什么例外?
-
我又要问了。为什么要扔?你对它有什么期望?你的进一步情况是什么?好吧,假设你抛出了一个异常,不管在哪里。下一步是什么?
-
澄清一下,我正在寻找的主要用例如下:用户查看产品或将商品添加到他们的购物车。这些操作需要通过控制器 -> repo 方法调用来访问数据库。如果出现问题(SELECT 找不到产品,INSERT 以某种方式创建了无效的 SQL 查询,或者该行已经存在等),它将将该错误吐回我可以在模板中显示的位置,以便用户知道什么发生了。示例:“抱歉,不存在此类产品”或“抱歉,此商品已在您的购物车中”。
-
谢谢。我已经更新了答案
-
购物车
INSERT应仅包含有效参数,即orderNum、SKU、数量、颜色、尺寸等。您的应用程序应确保仅将有效参数添加到查询中。