Yii2 RestFull API - Ошибка 404 на производстве с несколькими действиями - PullRequest
1 голос
/ 13 апреля 2020

У меня проблема, я создал много действий для API, используя Yii2. Я столкнулся с недавней проблемой: в то время как все работает на localhost, когда я загружаю на сервер, следующие действия возвращают ошибку 404.

Я пробовал много разных решений (попробуйте создать другой контроллер) без success

Целью этих функций является загрузка / удаление изображений.

config / main. php

      'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => require 'urls.php',
        ],

config / urls. php

    'POST api/controller/<id>/logo-upload' => 'controller-name/logo-upload',
    'POST api/controller/<id>/background-image-upload' => 'controller-name/background-image-upload',
    'POST api/controller/<id>/gallery-upload' => 'controller-name/update-gallery',
    'POST api/controller/<id>/delete-logo' => 'controller-name/delete-logo-image',
    'POST api/controller/<id>/delete-background' => 'controller-name/delete-background-image',
    'POST api/controller/<id>/gallery/<galleryID>/delete' => 'controller-name/delete-gallery-image',

Вот пример контроллера, который я создал. Я изменил некоторые имена переменных или имена классов, но ничего, что не меняет logi c.

имя контроллера. php

    <?php


namespace frontend\controllers;

use yii\rest\ActiveController;
use yii\filters\Cors;
use yii\helpers\ArrayHelper;
use yii\filters\ContentNegotiator;
use yii\web\Response;
use yii\helpers\BaseJson;
use yii\data\ActiveDataProvider;
use yii\web\UploadedFile;
use Yii;


class Controller extends RestController
{


    public $modelClass = 'common\models\Model';

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

        unset($actions['delete'], $actions['create'], $actions['update'], $actions['index'], $actions['options']);

        return $actions;
    }

    public function behaviors()
    {

        return ArrayHelper::merge([
            [
                'class' => Cors::className(),
                'cors' => [
                    'Origin' => ['*'],
                    'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS', 'POST'],
                ],
            ],
            [
                'class' => 'yii\filters\ContentNegotiator',
                'only' => ['view', 'index', 'update'],  // in a controller
                // if in a module, use the following IDs for user actions
                // 'only' => ['user/view', 'user/index']
                'formats' => [
                    'application/json' => Response::FORMAT_JSON,
                ],
                'languages' => [
                    'en',
                    'fr',
                ],
            ]
        ], parent::behaviors());
    }



    protected function verbs()
    {
        return [
            'index' => ['GET', 'HEAD'],
            'view' => ['GET', 'HEAD'],
            'create' => ['POST'],
            'update' => ['POST', 'PUT', 'PATCH'],
            'delete' => ['DELETE'],
        ];
    }

    protected function findModel($id)
    {
        if (($model = Model::findOne($id)) !== null &&
            (Yii::$app->user->identity->isAdmin() || $model->owner_id === Yii::$app->user->id)
        ) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
    public function actionLogoUpload($id)
    {
      $card = $this->findModel($id);
      $image = Image::upload($card, 'logoImageFile');
      if ($image->errors) {
        return $result = ["success"=>false, "message"=> $image->getErrors()];
      }
      if (!empty($image)) {

          $card->image_id = $image->id;
          if ($card->validate() && $card->save()) {
            $result = [
                "success"
            ];
            // }
            return $result;
          } else {
            return $result = ["success"=>false, "message"=> $card->getErrors()];
          }
      }

    }

}

Редактировать

Хорошо, удаление Content-type: multipart / form date в заголовке делает маршрут работающим, но, очевидно, код не работает, так как файл не отправляется.

1 Ответ

1 голос
/ 13 апреля 2020

Возможно, проблема в конфигурации вашего сервера. Вы должны настроить свой сервер так, чтобы он переписывал неизвестные пути к вашему скрипту index.php.

Например, когда я использовал yii2 с apache, у меня есть следующий файл web/.htaccess:

# use mod_rewrite for pretty URL support
RewriteEngine on

# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php

# ...other settings...
Options +FollowSymLinks

Конечно, многое зависит от вашего хостинга и конфигурации сервера (например, разрешены .htaccess файлы). В документации Yii есть больше информации по настройке различных веб-серверов здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...