des1roer
@des1roer
ученье - свет, а неученье - приятный полумрак

Yii2 как сделать api для фронта?

Есть такая структура для basic
GL9sUGVWQlmg-nolz3KT6A.png
modules/api/v1/controllers/PersController.php

<?php

namespace api\modules\v1\controllers;

use app\models\Pers;
use yii\rest\ActiveController;

class PersController extends ActiveController
{
    public $modelClass = Pers::class;

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['corsFilter' ] = [
            'class' => \yii\filters\Cors::className(),
        ];

        return $behaviors;
    }
}


config/web.php
'urlManager' => [
            'class' => 'yii\web\UrlManager',
            // Disable index.php
            'showScriptName' => false,
            'enableStrictParsing' => true,
            // Disable r= routes
            'enablePrettyUrl' => true,
            'rules' => array(
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            //    'signup' => '/myshop/default/signup',
            //    'submitsignup' => '/myshop/submitsignup',
                ['class' => 'yii\rest\UrlRule', 'controller' => 'api/v1/pers'],
            ),
        ],
        'request' => [
            'enableCookieValidation' => true,
            'enableCsrfValidation' => true,
            'cookieValidationKey' => '-Ghw8jpJL-0okgil5QLXZdNW2tHJIiBT',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ]
        ],
    ],
    'modules' => [
        'admin' => [
            'class' => 'app\modules\admin\Module',
        ],
        'user' => [
            'class' => 'amnah\yii2\user\Module',
        ],
        'api' => [
            'class' => 'app\modules\api\v1\Module',
        ],
    ],

но
aWM6tNiMSUCr3Rjg8Ms6BA.png
  • Вопрос задан
  • 722 просмотра
Пригласить эксперта
Ответы на вопрос 1
yii\rest\UrlRule добавляет свою логику в формирование запросов и для его работы нужно добавить s в конце эндпоинта. Например, если контроллер UserController, то для активации REST правил обработки урлов нужно делать запрос вида:
GET (PUT, POST): /api/v1/users

Также, как подметил padlyuck, у вас есть проблемы с неймспейсом. Например PersController у вас лежит совершенно в другом неймспейсе (api\modules\v1\controllers), когда сам модуль лежит, судя по конфигурации, app\modules\api\v1\Module. Такой расклад заведомо не рабочий - у вас контроллер модуля находится в совершенно другом месте, в отличие от модуля.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы