Search code examples
phprestyiiyii2-api

Rewrite POST method on rest api yii2


I must rewrite post request on rest yii2. Every time I've post request on URL v1/availability I want to call actionCreate for manage request.

This is my main.php

'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => ['v1/availability'],
                    'pluralize' => true,
                    'extraPatterns' => [
                        'POST v1/availability' =>   'v1/availability/create'
                    ]
                ],
                'OPTIONS v1/user/login' => 'v1/user/login',
                'POST v1/user/login' => 'v1/user/login',
                'POST v2/user/login' => 'v2/user/login',
                'OPTIONS v2/user/login' => 'v2/user/login',
            ],
        ],

In the v1/controllers/AvailabilityController.php i've

public function actions()
    {
        $actions = parent::actions();
        unset($actions['view']);
        return array_merge(
            $actions,
            [
                'index' => [
                    'class' => 'yii\rest\IndexAction',
                    'modelClass' => $this->modelClass,
                    'checkAccess' => [$this, 'checkAccess'],
                    'prepareDataProvider' => [$this, 'index']
                ],
            ]
        );
    }

public function actionCreate(){
        throw new \yii\web\HttpException(200, 'IT WORKS!', 200);
    }

Any idea?


Solution

  • add url rule outside like below.

    'urlManager' => [
                'enablePrettyUrl' => true,
                'enableStrictParsing' => true,
                'showScriptName' => false,
                'rules' => [
                    [
                        'class' => 'yii\rest\UrlRule',
                        'controller' => ['v1/availability']
                    ],
                    'POST v1/availability' =>   'v1/availability/create',
                    'OPTIONS v1/user/login' => 'v1/user/login',
                    'POST v1/user/login' => 'v1/user/login',
                    'POST v2/user/login' => 'v2/user/login',
                    'OPTIONS v2/user/login' => 'v2/user/login',
                ],
            ],
    

    And here you need understand rules of Yii. if you add one rule like below.

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

    this open many urls for clients.

    [
        'PUT,PATCH users/<id>' => 'user/update',
        'DELETE users/<id>' => 'user/delete',
        'GET,HEAD users/<id>' => 'user/view',
        'POST users' => 'user/create',
        'GET,HEAD users' => 'user/index',
        'users/<id>' => 'user/options',
        'users' => 'user/options',
    ]
    

    above all urls will open for clients.