Yii2 перенаправляет запрос почтальона на другой маршрут в интерфейсе API - PullRequest
0 голосов
/ 06 февраля 2020

Почтальон обращается к маршруту через API, созданный в Yii2, но код, который я вставляю в действие, соответствующее этому маршруту, не работает. Следуйте запросу print:

postman-request-print

Запрос возврата не должен был быть тем, что на изображении, потому что код, который я вставил в ' действие 'create' было таким:

    <?php

    namespace app\modules\api\controllers;

    use Yii;
    use app\modules\pesquisa_mercado\models\PontoDaPesquisa;

    class PesquisaPontoController extends \yii\rest\ActiveController
    {
       public $modelClass = 'app\modules\pesquisa_mercado\models\PesquisaPonto';

    public function behaviors()
    {
        $behaviors = parent::behaviors();

        return $behaviors + [
            [
                'class' => \yii\filters\auth\HttpBearerAuth::className(),
                'except' => ['options'],
            ],
            'verbs' => [
                'class' => \app\modules\api\behaviors\Verbcheck::className(),
                'actions' => [
                    'index' => ['GET'],
                    'create' => ['POST'],
                    'update' => ['PUT'],
                    'view' => ['GET'],
                    'delete' => ['DELETE'],
                    'finalizar-pesquisa' => ['POST'],
                ],
            ],
        ];
    }

    public function actions()
    {
        $actions = parent::actions();
        unset($actions['update']);
        return $actions;
    }

    public function actionCreate()
    {
       die("Test"); // test inserted here
    }

  }

То есть возвращение должно было быть 'Test'. По какой-то причине я не знаю, маршрут перенаправляется в другое место.

Я также обнаружил, что запрос проходит через метод getLinks (), присутствующий в модели PesquisaPonto:

<?php

namespace app\modules\pesquisa_mercado\models;

class PesquisaPonto extends \yii\db\ActiveRecord implements \yii\web\Linkable
{
  /**
   * @inheritdoc
   */
   public static function tableName()
   {
      return '{{%pesquisa_ponto}}';
   }

     /**
     * @inheritdoc
     */
    public function getLinks()  // the requisition also passes through here!
    {
        return [
            Link::REL_SELF => Url::to(['pesquisa-ponto/view', 'id' => $this->id], true),
            'index' => Url::to(['pesquisa-ponto'], true)
        ];
    }

}

Также следуйте конфигурации urlManager:

'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'enablePrettyUrl' => true,
            'showScriptName' => true,
            'rules' => [
                // Pontos de Pesquisa
                // api/pesquisa-ponto
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => [
                        'api/pesquisa-ponto'
                    ],
                    'pluralize' => false,
                ],
             ],
          ]

Я до сих пор не нашел причину, по которой Yii2 перенаправляет маршрут и не позволяет почтальону получить доступ к действию 'create' ...

1 Ответ

1 голос
/ 06 февраля 2020

Метод actions() в yii\rest\ActiveController выглядит следующим образом

 public function actions()
 {
    return [
        // ...
        'create' => [
            'class' => 'yii\rest\CreateAction',
            'modelClass' => $this->modelClass,
            'checkAccess' => [$this, 'checkAccess'],
            'scenario' => $this->createScenario,
        ],
        // ...
    ];
}

В вашей реализации метода actions() вы удаляете только конфигурацию для действия update, но конфигурацию для create действие осталось нетронутым. Это означает, что действие запускается из yii\rest\CreateAction, а не из actionCreate() метода контроллера.

Чтобы запустить действие из PesquisaPontoController::actionCreate(), необходимо сбросить конфигурацию для действия create как хорошо.

public function actions()
{
     $actions = parent::actions();
     unset($actions['update'], $actions['create']);
     return $actions;
}
...