Данная статья является продолжением поста “Программная архитектура”. Ознакомьтесь с ним перед тем, как приступить к изучению.
Простейшим архитектурным решением, является “Сценарий транзакции” (автор Мартин Фаулер). Это решение предлагает использовать несколько скриптовых сценариев, обрабатывающих запросы пользователя к системе и возвращающих ему результат этой обработки. Важным условием здесь является то, что сценарии отвечают за весь производственный цикл ответа, а не делегируют обработку другим частям приложения.
Рассмотрим несколько примеров:
<?php
// Процедурный стиль
// controller/guestbook.php
...
switch($_REQUEST['action']){
// Просмотр гостевой книги
case 'index':
$template = new Template('view/guestbook/index.php', [
'posts' => Db::getInstance()->select('SELECT * FROM `guestbook` LIMIT 10 ORDER BY `added` DESC')
]);
echo $template->render();
break;
// Добавление сообщения в гостевую книгу
case 'add':
$text = InputStringFilter($_POST['text']);
Db::getInstance()->insert('guestbook', [
'text' => $text,
'added' => time(),
]);
return header('Location: /guestbook.php?action=index');
break;
}
<?php
// Объектный стиль
// controller/guestbook.php
class GuestbookController{
// Просмотр гостевой книги
public function indexAction(){
$template = new Template('view/guestbook/index.php', [
'posts' => Db::getInstance()->select('SELECT * FROM `guestbook` LIMIT 10 ORDER BY `added` DESC')
]);
return $template->render();
}
// Добавление сообщения в гостевую книгу
public function addAction(){
$text = InputStringFilter($_POST['text']);
Db::getInstance()->insert('guestbook', [
'text' => $text,
'added' => time(),
]);
return header('Location: /guestbook.php?action=index');
}
}
Подобный подход чаще всего используется в небольших проектах и отличается следующими возможностями:
- Быстрая разработка, за счет исключения из архитектуры дополнительных компонентов, таких как модели, сервисы и т.д.
- Простота изучения (только до определенного момента), основанная на аккумуляции всей логики приложения в скрипты транзакций
К сожалению применение этой архитектуры в средних и крупных проектах влечет следующие проблемы:
- Дублирование кода, вызванное отсутствием гибкости архитектуры и невозможностью частичного вынесения логики из сценариев для повторного использования
- Раздувание сценариев (как следствие предыдущего пункта) и усложнение процесса их изучения