Использование 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 - обновление сообщения with ID 1
  • /index.php?r=post/delete&id=1 - удаление сообщения with ID 1

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

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