Я хотел бы, чтобы включил таблицу стилей и другие документы только , если они присутствуют в слое презентации. Как рекомендуется обращаться с ним? Я показываю две альтернативы, которые я вижу сейчас в соответствующих слоях:Должен ли я делать исключения в слое презентации?
Презентация:
<?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">';
// ...
?>
Проблема: это раздувание бизнес-логики с помощью части представления.
Как я могу отделить эти проблемы должным образом? Есть ли другая простая альтернатива, которую я не вижу?
Уровень презентации может принимать решения, относящиеся к презентации, конечно ... Помещение проверки на прикладном уровне для наличие CSS-файла, как полагает OP, приведет к перемещению логики представления в приложение. Приложение должно быть обеспокоено бизнес-логикой, а уровень представления касается логики представления, простой в этом. – quickshiftin
Он может принимать решения, конечно, поэтому [условные являются частью механизма шаблонов] (http://twig.sensiolabs.org/doc/tags/if.html). Это абсолютно не то же самое, что «бросать исключение», что по сути является решением «не продолжать рисовать». Это решение должно было быть принято до того, как было решено ** начать ** оказание. –
+1.После [спросил 1 год назад] (http://stackoverflow.com/q/14532084) У меня только одна таблица стилей. Итак, хотя ваше решение будет действительно, этот foreach будет эффективно действовать как 'if()'. Однако вы удаляете/упрощаете много логики, поэтому я буду использовать что-то очень похожее на ваш ответ. Кроме того, спасибо за предложение Twig, но я предпочитаю не добавлять еще один слой прямо сейчас, но я буду помнить его о будущем. –