2013-12-20 3 views
1

Я хотел бы, чтобы включил таблицу стилей и другие документы только , если они присутствуют в слое презентации. Как рекомендуется обращаться с ним? Я показываю две альтернативы, которые я вижу сейчас в соответствующих слоях:Должен ли я делать исключения в слое презентации?

Презентация:

<?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

Оба решения недействительны, именно по причинам, которые вы даете - вы не отделяете их должным образом. Правильно было бы:

бизнес-логики

$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

Уровень презентации может принимать решения, относящиеся к презентации, конечно ... Помещение проверки на прикладном уровне для наличие CSS-файла, как полагает OP, приведет к перемещению логики представления в приложение. Приложение должно быть обеспокоено бизнес-логикой, а уровень представления касается логики представления, простой в этом. – quickshiftin

+1

Он может принимать решения, конечно, поэтому [условные являются частью механизма шаблонов] (http://twig.sensiolabs.org/doc/tags/if.html). Это абсолютно не то же самое, что «бросать исключение», что по сути является решением «не продолжать рисовать». Это решение должно было быть принято до того, как было решено ** начать ** оказание. –

+0

+1.После [спросил 1 год назад] (http://stackoverflow.com/q/14532084) У меня только одна таблица стилей. Итак, хотя ваше решение будет действительно, этот foreach будет эффективно действовать как 'if()'. Однако вы удаляете/упрощаете много логики, поэтому я буду использовать что-то очень похожее на ваш ответ. Кроме того, спасибо за предложение Twig, но я предпочитаю не добавлять еще один слой прямо сейчас, но я буду помнить его о будущем. –

-1

Почему бы не выбрасывать исключения в слое? До тех пор, пока у вас есть способ правильно обрабатывать эти исключения в приложении и в конечном итоге отображать соответствующую страницу 'Oops' type;)

+0

Спасибо за комментарий, кто меня проголосовал. – quickshiftin

Смежные вопросы