The quickest way to add RestAPI to your Yii 2 app. Part 1
The example given in Yii 2 Guide is of a low quality, because it It requires User model based on database, not a file. And the guide mixes two things together:
- Yii 2 Basic Template, which is used in this example, has User model, but based on itself (on a file — list of users is given as an array)
- Yii 2 Advanced Template has User model based on database, but it uses a multi-application concept in the same time and adding REST support, like shown in this example, isn’t possible.
As an effect, people who just starts their journey with Yii 2 and REST are often confused and finds official example not working in their side.
This article deals with this problem and show how to enable REST in Yii 2 Basic Project Template by using some model (database-based) other than User model.
Prequities
We need:
- Model — I am using Country model from Getting Started: Working with Databases chapter of Yii 2 guide
- Controller — We create one, also based on the guide
- We don’t need a View, since we’re doing a RESTful app
And that is pretty much everything since Yii 2 is doing most of the “dirty stuff” for you, behind the scenes. And thus coding really simple RESTful apps is… really simple! :)
The model
I used the one from the Guide, but you can use pretty much anyone:
<?php namespace app\models; use yii\db\ActiveRecord; class Country extends ActiveRecord { }
It’s empty because (again!) Yii 2 is doing all the stuff for you.
Name it as Country.php and put it to models folder of your Yii 2 Basic app.
The controller
I’ve created one also based on the guide. I only changed paths to use Country model instead of User model, which doesn’t work in Yii 2 Basic App Template:
<?php namespace app\controllers; use yii\rest\ActiveController; class CountryController extends ActiveController { public $modelClass = 'app\models\Country'; }
Put it to controllers folder under CountryController.php file name.
Let’s rock!
Here you have an example of calling above created endpoint, as tested in Insomia, curl and directly in browser:
You can already see another powerful feature of Yii 2’s RESTful apps — response content negotiation.
Browser requests XML and receives response in this format (left part of the image). Insomia was force-configured to request response in JSON (middle part of the image). Which turned out to be not necessary, because yii\rest\Controller
responds with JSON by default (right part of the image — curl).