没有型号的Yii2 RESTFUL API:获得404响应

时间:2015-11-20 11:27:57

标签: yii2

我正在使用Yii2实现RESTFUL API。问题是我根本不使用模型。我的API只获取请求并执行一些计算(或将请求作为代理传递到其他地方)并输出响应。

我在app \ modules \ api \ v1 \ controllers中有以下控制器:

namespace app\modules\api\v1\controllers;

class CarController extends \yii\rest\Controller
{
    // GET /v1/car/:id
    public function actionIndex()
    {
        $carId = \Yii::$app->request->get('id');

        // Forwarding request to other API

        return ['some_reponse'];
    }

    // DELETE /v1/car/:id
    public function actionDelete()
    {
        $carId = \Yii::$app->request->get('id');

        // Forwarding request to other API

        return ['some_reponse'];
    }

    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => \yii\filters\VerbFilter::className(),
                'actions' => [
                    'create'  => ['post'],
                    'delete' => ['delete']
                ],
            ],
        ];
    }

}

// ===============================

namespace app\modules\api\v1\controllers;

class CarsController extends \yii\rest\Controller
{
    // POST /v1/cars
    public function actionCreate()
    {
        $carData = \Yii::$app->request->post;

        // Forwarding data to other API

        return ['some_reponse'];
    }

    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => \yii\filters\VerbFilter::className(),
                'actions' => [
                    'create'  => ['post']
                ],
            ],
        ];
    }

}

// ===============================

namespace app\modules\api\v1\controllers;

class NotificationsController extends \yii\rest\Controller
{
    // POST /v1/notifications
    public function actionCreate()
    {
        $noticicationsData = \Yii::$app->request->post;

        // Perform some additinal actions here

        return ['some_reponse'];
    }

    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => \yii\filters\VerbFilter::className(),
                'actions' => [
                    'create'  => ['post']
                ],
            ],
        ];
    }
}

网址管理员配置:

'urlManager'   => [
    'enablePrettyUrl'     => true,
    'enableStrictParsing' => true,
    'showScriptName'      => false,
    'rules'               => [
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/cars' ],
            'extraPatterns' => [ 'POST cars' => 'create' ]
        ],
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/car' ],
            'extraPatterns' => [ 'GET car' => 'index', 'DELETE car' => 'delete' ]
        ],
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/notifications' ],
            'extraPatterns' => [ 'POST notifications' => 'create' ]
        ]
    ]
]

汽车端点工作正常。但其他endoints返回404错误。错误响应示例:

{
  "name": "Not Found",
  "message": "Page not found.",
  "code": 0,
  "status": 404,
  "type": "yii\web\NotFoundHttpException",
  "previous": {
    "name": "Invalid Route",
    "message": "Unable to resolve the request: v1/car/options",
    "code": 0,
    "type": "yii\base\InvalidRouteException"
  }
}

这里有什么想法吗?我猜我的规则有问题。

2 个答案:

答案 0 :(得分:2)

问题在于urlManager规则配置。对于例如如果我创建CarController它就像CarsController一样。所以我必须将pluralize设置为false。还修改了extraPatterns部分:

'urlManager'   => [
    'enablePrettyUrl'     => true,
    'enableStrictParsing' => true,
    'showScriptName'      => false,
    'rules'               => [
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/cars' ],
            'extraPatterns' => [ 'POST' => 'create' ],
        ],
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/car' ],
            'extraPatterns' => [ 'GET' => 'index', 'DELETE' => 'delete' ],
            'pluralize'     => false
        ],
        [
            'class'         => 'yii\rest\UrlRule',
            'controller'    => [ 'v1/notifications' ],
            'extraPatterns' => [ 'POST' => 'create' ]
        ]
    ]
]

答案 1 :(得分:0)

yii \ rest \ Controller :: actions()问题,此方法已经有动作索引,选项,视图等。您需要禁用操作才能使用您的操作:

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