我应该在表示层中抛出异常吗?

时间:2013-12-20 22:31:39

标签: php exception error-handling separation-of-concerns

我想包含样式表和其他文档如果它们存在在表示层中。怎么建议处理它?我展示了我们现在在各自层中看到的两种选择:

演示

<?php
$internalpath = "/internal/path/style.css";
if (!file_exists($internalpath))
  throw new Exception("Couldn't find style.css in " . $internalpath);
else {
?>
<link href="/external/path/style.css" rel="stylesheet" type="text/css">
<?php } ?>

问题:使用业务逻辑使视图膨胀

商业逻辑

<?php
$internalpath = "/internal/path/style.css";
if (!file_exists($internalpath))
  throw new Exception("Couldn't find style.css in " . $internalpath);
else
  $style = '<link href="/external/path/style.css" rel="stylesheet" type="text/css">';

// ...
?>

问题:部分视图使业务逻辑膨胀。

如何正确区分这些问题?我还没有看到其他简单的替代方案吗?

2 个答案:

答案 0 :(得分:2)

这两种解决方案都是无效的,完全是出于您给出的原因 - 您没有正确地将它们分开。正确的是:

业务逻辑

$customStylesheets = [];
$internalpath = "/internal/path/style.css";
if (!file_exists($internalpath))
  throw new Exception("Couldn't find style.css in " . $internalpath);
$customStylesheets[] = RewriteToExternal($internalPath);

<强>演示

<?php foreach($customStylesheets as $stylesheet) : ?>
    <link href="<?=$stylesheet ?>" rel="stylesheet" type="text/css">
<?php endforeach; ?>

这种方式使业务逻辑担心需要发生什么,以及如何呈现的演示文稿。

至于一般问题:不,在渲染过程中永远不应抛出异常。一旦业务逻辑认为请求可以接受,它就应该完全正确地呈现。表示层不是关于决策,而是关于输出。如果某些事情在那时“异常”失败,你搞砸了BL层中的错误检查。

为了使这些问题更加明显,请不要使用PHP作为模板引擎,而是抓住像Twig这样美丽的东西,强制让你的模板纯粹呈现。 PHP作为模板引擎对于某些人来说是一个非常大的邀请,可以正确分离。

答案 1 :(得分:-1)

为什么不在视图层中抛出异常?只要您有办法在应用程序中正确处理这些异常并最终显示适当的'Oops' type页面;)