# Использование Yii в качестве микро-framework'а ¶

Yii можно легко использовать без функций включенных в базовый и расширенный шаблоны приложений. Другими словами Yii уже является микро-каркасом. Не требуется иметь структуру каталогов предоставляемую этими шаблонами при работе с Yii.

Это особенно удобно, когда Вам не нужен весь пред-установленный шаблонный код, такой как `Assets` или `Views`. Одним из таких случаев является создание JSON API. В следующих разделах будет показано, как это сделать.

## Установка Yii ¶

Создайте каталог для файлов проекта и смените рабочий каталог на этот путь. В примерах используются команды Unix, но аналогичные команды существуют и в Windows.

    mkdir micro-app
    cd micro-app

> Примечание: Для продолжения требуется немного знаний о Composer. Если Вы еще не знаете, как использовать Composer, пожалуйста, найдите время, чтобы прочитать Руководство Composer.

Создайте файл `composer.json` в каталоге `micro-app` с помощью Вашего любимого редактора и добавьте следующее:

    {
        "require": {
            "yiisoft/yii2": "~2.0.0"
        },
        "repositories": [
            {
                "type": "composer",
                "url": "https://asset-packagist.org"
            }
        ]
    }

Сохраните файл и запустите команду `composer install`. Это установит framework со всеми его зависимостями.

## Создание структуры проекта ¶

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

Создайте каталог `web` и поместите в него файл `index.php` со следующим содержимым:

    <?php

    // закомментируйте следующие две строки при использовании в рабочем режиме
    defined('YII_DEBUG') or define('YII_DEBUG', true);
    defined('YII_ENV') or define('YII_ENV', 'dev');

    require(__DIR__ . '/../vendor/autoload.php');
    require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

    $config = require __DIR__ . '/../config.php';
    (new yii\web\Application($config))->run();

Также создайте файл с именем `config.php`, который будет содержать всю конфигурацию приложения:

    <?php
    return [
        'id' => 'micro-app',
        // basePath (базовый путь) приложения будет каталог `micro-app`
        'basePath' => __DIR__,
        // это пространство имен где приложение будет искать все контроллеры
        'controllerNamespace' => 'micro\controllers',
        // установим псевдоним '@micro', чтобы включить автозагрузку классов из пространства имен 'micro'
        'aliases' => [
            '@micro' => __DIR__,
        ],
    ];

> Информация: Несмотря на то, что конфигурация приложения может находиться в файле `index.php` рекомендуется содержать её в отдельном файле. Таким образом её можно также использовать и для консольного приложения, как показано ниже.

Теперь Ваш проект готов к наполнению кодом. Вам решать какую структуру каталогов проекта Вы выберите, пока Вы сможете видеть пространства имен.

## Создание первого контроллера ¶

Создайте каталог `controllers` и добавьте туда файл `SiteController.php` который является контроллером по умолчанию, он будет обрабатывать запрос без пути.

    <?php

    namespace micro\controllers;

    use yii\web\Controller;

    class SiteController extends Controller
    {
        public function actionIndex()
        {
            return 'Hello World!';
        }
    }

Если Вы хотите использовать другое имя для этого контроллера, Вы можете изменить его настроив yii\base\Application::$defaultRoute. Например для `DefaultController` будет соответственно `'defaultRoute' => 'default/index'`.

На данный момент структура проекта должна выглядеть так:

    micro-app/
    ├── composer.json
    ├── web/
        └── index.php
    └── controllers/
        └── SiteController.php

Если Вы еще не настроили веб-сервер, Вы можете взглянуть на примеры конфигурационных файлов веб-серверов. Другой возможностью является использование команды `yii serve` которая будет использовать встроенный веб-сервер PHP. Вы можете запустить её из каталога `micro-app/` через:

    vendor/bin/yii serve --docroot=./web

При открытии URL приложения в браузере, он теперь должен печатать "Hello World!" который был возвращен из `SiteController::actionIndex()`.

> Информация: В нашем примере мы изменили пространство имен по умолчанию приложения с `app` на`micro`, чтобы продемонстрировать что Вы не привязаны к этому имени (в случае, если Вы считали, что это так), а затем скорректировали controllers namespace и установили правильный псевдоним.

## Создание REST API ¶

Чтобы продемонстрировать использование нашей "микроархитектуры", мы создадим простой REST API для сообщений.

Чтобы этот API обслуживал некоторые данные, нам нужна база данных. Добавим конфигурацию подключения базы данных к конфигурации приложения:

    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'sqlite:@micro/database.sqlite',
        ],
    ],

> Информация: Для простоты мы используем базу данных sqlite. Дополнительную информацию см. в Руководство по базам данных.

Затем мы создаем миграции базы данных для создания таблицы сообщений. Убедитесь, что у Вас есть отдельный файл конфигурации, как описано выше, нам это нужно для того, чтобы запустить консольные команды описанные ниже. Запуск следующих команд создаст файл миграции базы данных и применит миграцию к базе данных:

    vendor/bin/yii migrate/create --appconfig=config.php create_post_table --fields="title:string,body:text"
    vendor/bin/yii migrate/up --appconfig=config.php

Создайте каталог `models` и файл`Post.php` в этом каталоге. Это код модели:

    <?php

    namespace micro\models;

    use yii\db\ActiveRecord;

    class Post extends ActiveRecord
    {
        public static function tableName()
        {
            return '{{posts}}';
        }
    }

> Информация: Созданная модель представляет собой класс ActiveRecord, который представляет данные из таблицы `posts`. Для получения дополнительной информации обратитесь к active record руководству.

Чтобы обслуживать сообщения в нашем API, добавьте `PostController` в`controllers`:

    <?php

    namespace micro\controllers;

    use yii\rest\ActiveController;

    class PostController extends ActiveController
    {
        public $modelClass = 'micro\models\Post';

        public function behaviors()
        {
            // удаляем rateLimiter, требуется для аутентификации пользователя
            $behaviors = parent::behaviors();
            unset($behaviors['rateLimiter']);
            return $behaviors;
        }
    }

На этом этапе наш API предоставляет следующие URL-адреса:

- `/index.php?r=post` - список всех сообщений
- `/index.php?r=post/view&id=1` - просмотр сообщения с ID 1
- `/index.php?r=post/create` - создание сообщения
- `/index.php?r=post/update&id=1` - обновление сообщения с ID 1
- `/index.php?r=post/delete&id=1` - удаление сообщения с ID 1

Начиная с этого момента Вы можете посмотреть следующие руководства для дальнейшего развития своего приложения:

- API в настоящий момент понимает только данные urlencoded как входные данные, чтобы сделать его настоящим JSON API, Вам необходимо настроить yii\web\JsonParser.
- Чтобы сделать URL более дружественным, вам необходимо настроить маршрутизацию. См. Руководство по маршрутизации REST о том, как это сделать.
- Дополнительную информацию см. в разделе Взгляд в будущее.