Пытаюсь создать API посредством модуля, но что-то не выходит, не работает ничего "из коробки", как ожидалось.
Текущая цель: получение стран из таблицы country посредством модели common\models\Country.
В качестве руководства взял Быстрый старт .
Итак, создаю модуль, в нем прописываю конфигурацию:
Код: Выделить всё
<?php
namespace frontend\modules\api;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'frontend\modules\api\controllers';
public function init()
{
//curl -i -H "Accept:application/json" "http://local/api/countries/"
//curl -i -H "Accept:application/json" "http://local/api/countries/63"
parent::init();
\Yii::configure($this, [
'on beforeAction' => function(){}, //должен был "перебить" beforeAction из глобальной конфигурации, но не перебивает :(
'components' => [
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'countries',
'pluralize' => false, //запретил - было подозрение, что проблема в этом.
],
],
],
],
]);
}
}
Код: Выделить всё
<?php
namespace frontend\modules\api\controllers;
use yii\web\Controller;
use yii\rest\ActiveController;
class CountriesController extends ActiveController
{
public $modelClass = 'common\models\Country';
}
Код: Выделить всё
[{"country_id":"4","city_id":0,"name":"Австралия"},{"country_id":"63","city_id":0,"name":"Австрия"},{"country_id":"81","city_id":0,"name":"Азербайджан"},{"country_id":"173","city_id":0,"name":"Ангуилья"},{"country_id":"177","city_id":0,"name":"Аргентина"},{"country_id":"245","city_id":0,"name":"Армения"},{"country_id":"248","city_id":0,"name":"Беларусь"},{"country_id":"401","city_id":0,"name":"Белиз"},{"country_id":"404","city_id":0,"name":"Бельгия"},{"country_id":"425","city_id":0,"name":"Бермуды"},{"country_id":"428","city_id":0,"name":"Болгария"},{"country_id":"467","city_id":0,"name":"Бразилия"},{"country_id":"616","city_id":0,"name":"Великобритания"},{"country_id":"924","city_id":0,"name":"Венгрия"},{"country_id":"971","city_id":0,"name":"Вьетнам"},{"country_id":"994","city_id":0,"name":"Гаити"},{"country_id":"1007","city_id":0,"name":"Гваделупа"},{"country_id":"1012","city_id":0,"name":"Германия"},{"country_id":"1206","city_id":0,"name":"Голландия"},{"country_id":"1258","city_id":0,"name":"Греция"}]
http://nh/api/countries/63 - 404, страница не найдена. Причем, как ни старался, выводится либо исключение голым текстом, либо полный срач с html-тегами. Делал, как описано здесь:
Нифига REST-контроллер сам не отформатировал. Может у меня "коробка" неправильная...Идея состояла в том, чтобы формировать ответ с Exception’ом в виде массива, а далее REST-контроллер сам отформатирует это в JSON (такова логика работы REST-контроллеров в Yii2 “из коробки”).
И так с любыми данными - общий список - ок, остальное - 404.
Пока единственный код ответа, который выводится как надо - это 400 в ответ на http://nh/api/countries/view:
Код: Выделить всё
{"name":"Bad Request","message":"Отсутствуют обязательные параметры: id","code":0,"status":400,"type":"yii\\web\\BadRequestHttpException"}
В чём моя ошибка? Как правильно использовать все возможности REST в модуле? И как в модуле перебить beforeAction, заданный в приложении?
UPD: судя по всему, Yii::configure($this, [...]); здесь вообще не работает.
UPD2: Попробовал Adding Rules Dynamically. Параметры начинают работать, но enableStrictParsing ломает сразу всё приложение (увы, bootstrap оказывает глобальное влияние на настройки). Видимо, моя идея с API на модуле была изначально дохлой.