Реализация RESTful API в Yii2

· yii php

Yii2 из коробки предоставляет удобный фреймворк для построения REST API вашего сервиса. Ниже я опишу как быстро начать его использовать.

Предварительная настройка

Для начала работы достаточно базового шаблона Yii2. Создание проекта и настройку виртуального хоста я описывать не буду и перейду сразу к настройке REST.

После скачивания проекта настроим компоненту user в файле web.php. Добавим туда следующие строки:

'enableSession' => false,
'loginUrl' => null,

Первая строка отключает сохранение состояния пользователя на сервере: одно из требований архитектуры REST.

Вторая строка отключает перенаправление на страницу входа после неудачной аутентификации.

В User.php добавим следующий код:

public static function getAll()
{
   $result = [];

   foreach (self::$users as $user) {
       $result[] = [
           'id' => $user['id'],
           'username' => $user['username'],
       ];
   }

   return $result;
}

Создание контроллера

Мы не используем базу данных в нашем примере и создание контроллера займет чуть больше времени, чем в случае использования AR-моделей.

В папке controllers создадим файл UserController.php со следующим содержимым:

<?php
namespace app\controllers;

use yii\rest\Controller;
use app\models\User;

class UserController extends Controller
{
    public function actionIndex()
    {
        return User::getAll();
    }

    /**
     * @inheritdoc
     */
    protected function verbs()
    {
        return [
            'index' => ['GET', 'HEAD'],
        ];
    }
}

Как видно из примера, мы наследуем свой класс от yii\rest\Controller. Данный класс реализует поддержку сериализации и представления массивов в форматах XML и JSON перед отправкой ответа. Дополнительно можно задать параметры аутентификации и ограничить количесто запросов к API.

Метод verbs позволяет задать типы запросов, которые принимает каждое из действий контроллера.

Чтобы контроллер заработал, нужно отредактировать настройки компоненты urlManager в файле web.php:

'rules' => [
    ['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],

Протестируем работу API, используя curl:

$ curl -i -H "Accept:application/json" "http://yii2-rest.dev/users"
$ curl -i -H "Accept:application/xml" "http://yii2-rest.dev/users"

Вместо yii2-rest.dev нужно указать имя вашего хоста.

Аутентификация

При реализации любого из методов аутентификации в продакшене не забывайте об использовании https для предотвращения атаки типа “человек посередине”

Yii2 поддерживает несколько типов аутентификации. Реализуем HTTP Basic Auth.

В UserContoller.php добавим следующие строки:

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
    ];

    return $behaviors;
}

Не забываем перед объявлением класса прописать:

use yii\filters\auth\HttpBasicAuth;

Чтобы все заработало, модель пользователя должна реализовывать метод findIdentityByAccessToken. Если вы используете базовый шаблон Yii2, то он уже реализован и ничего менять не нужно.

Проверям работу механизма аутентификации:

$ curl -i -H "Accept:application/json" "http://yii2-rest.dev/users"

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

Пробуем авторизоваться, используя HTTP Basic Auth:

$ curl -i -H "Accept:application/json" "http://yii2-task_manager.dev/users" -H "Authorization: Basic MTAwLXRva2VuOg=="

Должен вернуться полный список пользователей в json-ответе.

Заключение

Я описал лишь один из вариантов реализации REST в Yii2. Без рассмотрения остались множество других тем, таких как версионирование, ограничение числа запросов и обработка ошибок. Многое из этого описано в документации.