Необходимо в модели в методе создавать в цикле методы для атрибутов, например getItems(). Это необходимо автоматически в цикле сделать, если атрибут array.
вот пример кода:
Код: Выделить всё
class JsonModel extends \yii\base\Model
{
public function load($data, $formName = '')
{
foreach ($data as $key => $value) {
if(is_array($value)) {
$className = Inflector::camel2words($key);
$modelName = "\\frontend\\models\\json\\$className";
$model = new $modelName;
$model->load($value);
$this->addMethod('get' . Inflector::camel2words($key), function($model){return $model;});
}
}
return parent::load($data, $formName);
}
function addMethod($name, $method)
{
$this->{$name} = $method;
}
public function __call($name, $arguments)
{
return call_user_func($this->{$name}, $arguments);
}
}
//********************
class Json extends JsonModel
{
public $user_id;
public $name;
public $attribute;
public function rules()
{
return [
[['user_id', 'name', 'attribute'], 'required'],
[['user_id'], 'integer'],
[['name'], 'string', 'max' => 250],
];
}
}
//******
class Attribute extends JsonModel
{
public $name;
public function rules()
{
return [
[['name'], 'required'],
[['name'], 'string', 'max' => 250],
];
}
}
Код: Выделить всё
public function actionJson()
{
$json = '{
"data": {
"name": "users",
"user_id": "1",
"attribute": {
"name": "test"
}
}
}';
$model = new Json();
$model->load(json_decode($json, 1)['data']);
$model->validate();
echo "\n<pre>" . print_r($model->attribute->name,1) . "</pre>"; die;
}