【问题标题】:rewrite POST method on rest api yii2在rest api yii2上重写POST方法
【发布时间】:2017-04-13 16:41:06
【问题描述】:

我必须在 rest yii2 上重写发布请求。 每次我在 url v1/availability 上发布请求时 我想为管理请求调用 actionCreate。

这是我的 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',
            ],
        ],

在 v1/controllers/AvailabilityController.php 我已经

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);
    }

有什么想法吗?

【问题讨论】:

    标签: rest api yii yii2 yii2-api


    【解决方案1】:

    在外面添加 url 规则,如下所示。

    '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',
                ],
            ],
    

    这里你需要了解 Yii 的规则。如果您添加如下规则。

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

    这会为客户打开许多网址。

    [
        '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',
    ]
    

    以上所有网址都将为客户打开。

    【讨论】:

      【解决方案2】:

      所以... 有两种方法可以覆盖帖子。

      第一个@Irfan Ali 方法 此方法允许在 main.php 中声明单个调用并在控制器中使用单个函数。

      第二种方法是 在 main.php 中声明对可用性的一般调用

      'urlManager' => [
              'enablePrettyUrl' => true,
              'enableStrictParsing' => true,
              'showScriptName' => false,
              'rules' => [
                  [
                      'class' => 'yii\rest\UrlRule',
                      'controller' => ['v1/availability'],
                      'pluralize' => true,
                  ],
              ],
          ],
      

      对于拦截 post 方法,您必须在控制器中覆盖

      public function createAction($id){
          throw new \yii\web\HttpException(200, 'You receive post or put', 200);
      }
      

      并且在这个函数中你必须拦截如果调用是发布你做任何事情。

      我喜欢第一种方法!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 2023-04-09
        • 1970-01-01
        • 2015-11-13
        • 2017-11-02
        • 2021-04-05
        相关资源
        最近更新 更多