我想包含样式表和其他文档如果它们存在在表示层中。怎么建议处理它?我展示了我们现在在各自层中看到的两种选择:
演示:
<?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">';
// ...
?>
问题:部分视图使业务逻辑膨胀。
如何正确区分这些问题?我还没有看到其他简单的替代方案吗?
答案 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页面;)