Bounce
Bounce

Reputation: 2095

Yii2 RESTFUL API without models: getting 404 response

I'm implementing RESTFUL API with Yii2. The thing is I don't use models at all. My API just gets the request and performs some calculations (or passes request as a proxy to somewhere else) and outputs the response.

I have following controllers in 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']
                ],
            ],
        ];
    }
}

Url manager configuration:

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

Cars endpoint works fine. But other endoints return 404 error. Error response example:

{
  "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"
  }
}

Any ideas whats wrong here? I guess something is wrong with my rules.

Upvotes: 0

Views: 3703

Answers (2)

Bounce
Bounce

Reputation: 2095

The problem was with urlManager rules configuration. For e.g. if I create CarController it treats like CarsController. So I have to set pluralize to false. Also modified extraPatterns section as well:

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

Upvotes: 2

Bookin
Bookin

Reputation: 282

Problem with yii\rest\Controller::actions(), this method already have actions index , options,view etc. You need disabled action to use your action:

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

Upvotes: 0

Related Questions