Блог хеллоуворлдщика

Backend для веб-приложения на Yii

24.06.2014 backend, yii

При разработке веб-приложения часто возникает вопрос, как организовать frontend и backend. Для backend-части существует несколько подходов, и выбор зависит от требований проекта и необходимой степени разделения компонентов.

Один из распространённых вариантов — оформить backend как модуль. Для описываемой структуры я считаю этот подход наиболее удобным. Рассмотрим три основных варианта организации:

  1. Как отдельное приложение.
  2. Как единое приложение.
  3. Модулем.

Первый подход — вынести backend в отдельное приложение. Такое разделение может упростить организацию кода и работы над разными частями системы, если проекту требуется самостоятельная структура backend. Подробное описание этого решения, в том числе для Yii 2, заслуживает отдельной статьи.

Второй вариант — реализовать frontend и backend в одном приложении. Здесь я не буду подробно его рассматривать: для описываемого случая я предпочитаю модульную структуру, а об этом способе уже опубликовано много материалов.

Третий вариант — оформить backend как модуль. Для рассматриваемой структуры я предпочитаю именно его. При этом важно грамотно организовать код. Например, не стоит выносить все административные контроллеры в отдельный каталог верхнего уровня:

- backend
-- controllers
--- PostController.php
--- CommentsController.php
-- views
-- models

Административные контроллеры удобнее сгруппировать внутри соответствующих модулей. Для этого в controllers каждого модуля создаётся подкаталог backend, а связанные с модулем контроллеры, представления и модели хранятся вместе. Например, структура модуля blog может выглядеть так:

- blog
-- controllers
--- backend
---- PostController.php
--- PostController.php
-- views
--- backend
---- post
--- post
-- models

Для доступа к контроллерам можно определить маршруты, например:

'backend/<module:\w+>/<controller:\w+>' => '<module>/backend/<controller>/index',
'backend/<module:\w+>/<controller:\w+>/<action:\w+>/*' => '<module>/backend/<controller>/<action>',
'backend/<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/backend/<controller>/<action>',

Кроме того, для frontend и backend можно использовать отдельные конфигурационные файлы. В примере ниже точка входа index.php выбирает конфигурацию по первой части URL:

$path = explode('/', $_SERVER['REQUEST_URI']);
switch ($path[1])
{
    case 'backend':
        $config = dirname(__FILE__) . '/../protected/config/backend.php';
        break;
    
    default:
        $config = dirname(__FILE__) . '/../protected/config/frontend.php';
}

$yii = dirname(__FILE__) . '/../framework/yii.php';
require_once($yii);

Yii::createWebApplication($config)->run();

Такой подход размещает административные контроллеры рядом с соответствующими модулями и позволяет задать для backend отдельные маршруты и настройки.