5
votes

New to Yii2 nuances.

Just trying to get a return from a ActiveRecord query. I realize there is probably a much easier way to do this using Yii2 conventions

public function actionGet_permissions() {

    $sql = 'select * from auth_item where owner_user_id IS NULL';
    return Auth_Item::findBySql($sql)->all();
}
  • Errors "Response content must not be an array."

I think its pretty obvious the simple set of records I'm trying to return with this function. Any help is much appreciated, and let me know if any other information will help.

Why would findBySql not be allowed to return an array? I know I'm missing something simple here.

Thanks!

Edit 1:

Auth_Item::find()->where(['owner_user_id' => null])->all();

Returns the same error. And again, this seems like such a simple query.

Edit 2:

Stack Trace:

Invalid Parameter – yii\base\InvalidParamException
Response content must not be an array.
•   1. in C:\xampp\htdocs\clienti\vendor\yiisoft\yii2\web\Response.php at line 944 
            throw new InvalidConfigException("The '{$this->format}' response formatter is invalid. It must implement the ResponseFormatterInterface.");
        }
    } elseif ($this->format === self::FORMAT_RAW) {
        $this->content = $this->data;
    } else {
        throw new InvalidConfigException("Unsupported response format: {$this->format}");
    }

    if (is_array($this->content)) {
        throw new InvalidParamException("Response content must not be an array.");
    } elseif (is_object($this->content)) {
        if (method_exists($this->content, '__toString')) {
            $this->content = $this->content->__toString();
        } else {
            throw new InvalidParamException("Response content must be a string or an object implementing __toString().");
        }
    }
}
}
•   2. in C:\xampp\htdocs\cli\vendor\yiisoft\yii2\web\Response.php – yii\web\Response::prepare() at line 312 
•   3. in C:\xampp\htdocs\cli\vendor\yiisoft\yii2\base\Application.php – yii\web\Response::send() at line 381 
•   4. in C:\xampp\htdocs\cli\frontend\web\index.php – yii\base\Application::run() at line 18 

Edit 3:

Thanks for the help guys. Json encoding the result fixed the issue.

public function actionGet_permissions() {
    $result = Auth_Item::find()->where(['owner_user_id' => NULL])->all();
    return Json::encode($result);
}
4
What kind of response do you need? usually controller actions need to return the result from rendering a view, but you can also return json, xml or other file format, however you need to do some configuration to do so.marche
Ug, wow, yes that was it, Json::encode($result); did the trick. Incognito Skull said the same thing but for some reason it didnt quite click. Thanks guys!Goat
I almost feel like I should delete all that code I posted in Edit 2 so it doesn't distract people from the simple answer in the future... what do you think?Goat

4 Answers

5
votes

You should use Yii2 features and modify response format.

Default response format is HTML, that's why you have the following error :

Response content must not be an array

You should simply try this :

public function actionGet_permissions()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return Auth_Item::find()->where(['owner_user_id' => NULL])->all();
}

Yii will automatically send http headers (previous answer will not) and encode your models.

Read more : http://www.yiiframework.com/doc-2.0/guide-runtime-responses.html

And if you want to use this response format in all your controllers, you could modify response config :

'response' => [                 
    'format' => yii\web\Response::FORMAT_JSON, 
    'charset' => 'UTF-8',               
],

Read more about yii\web\Response

1
votes

Use Active Record:

public function actionGet_permissions() {
   $result = Auth_Item::find()->where(['owner_user_id' => NULL])->all();
   return Json::encode($result);
}
0
votes

Better You make changes directly into your configuration file so that every request gets the proper json encoding.

'response' => [                 
'format' => yii\web\Response::FORMAT_JSON, 
                'charset' => 'UTF-8',               
 ],
0
votes

format json makes the variable post process automatically scalar by converting to json, whereas html response type does not convert arrays to scalars, therefore arrays have to have json response, I accidentally changed response type to HTML, but did forget to get rid of array structure at a particular place