如何在没有数据库的情况下创建 Yii2 模型
How to create a Yii2 model without a database
我想创建一个没有数据库的 yii2 模型。相反,数据是动态生成的而不是存储的,只是作为 json 显示给用户。基本上,我只想得到一个简单的、基本的非数据库模型示例,但我找不到任何关于它的文档。
那么没有数据库怎么写模型呢?我已扩展 \yii\base\Model
但我收到以下错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<name>PHP Fatal Error</name>
<message>Call to undefined method my\app\models\Test::find()</message>
<code>1</code>
<type>yii\base\ErrorException</type>
<file>/my/app/vendor/yiisoft/yii2/rest/IndexAction.php</file>
<line>61</line>
<stack-trace>
<item>#0 [internal function]: yii\base\ErrorHandler->handleFatalError()</item>
<item>#1 {main}</item>
</stack-trace>
</response>
要实现 find()
,我必须 return 一个数据库查询对象。
我的模型完全是空白,我只是在寻找一个简单的例子来理解原理。
<?php
namespace my\app\models;
class Test extends \yii\base\Model{
}
使用模型的原因是对从某处获取的数据执行某种逻辑。模型可用于执行数据验证、模型的 return 属性及其标签,并允许进行大规模分配。如果您的数据模型不需要这些功能,请不要使用模型!
如果您不需要数据验证(即您不通过表单或其他外部来源更改任何数据),并且您不需要访问行为或事件,那么您可能只需要使用 yii\base\Object.这将使您能够访问对象属性的 getter 和 setter,这似乎就是您所需要的。
所以你的 class 最终看起来像这样。我已经包括从另一个模型获取数据,以防这是你想要做的;
<?php
namespace my\app\models;
use \path\to\some\other\model\to\use\OtherModels;
class Test extends \yii\base\Object{
public function getProperty1(){
return "Whatever you want property1 to be";
}
public function getProperty2(){
return "Whatever you want property2 to be";
}
public function getOtherModels(){
return OtherModels::findAll();
}
}
然后你就可以像这样简单地使用它;
$test = new Test;
echo $test->property1;
foreach ($test->otherModels as $otherModel){
\Do something
}
您尝试使用的函数 find() 仅与数据库相关,因此如果您扩展 yii\base\Model、yii\base\Component或yii\base\Object,除非你想自己定义这样的函数。
这是我的一个项目中的 Model
。此 Model
未连接任何数据库。
<?php
/**
* Created by PhpStorm.
* User: Abhimanyu
* Date: 18-02-2015
* Time: 22:07
*/
namespace backend\models;
use yii\base\Model;
class BasicSettingForm extends Model
{
public $appName;
public $appBackendTheme;
public $appFrontendTheme;
public $cacheClass;
public $appTour;
public function rules()
{
return [
// Application Name
['appName', 'required'],
['appName', 'string', 'max' => 150],
// Application Backend Theme
['appBackendTheme', 'required'],
// Application Frontend Theme
['appFrontendTheme', 'required'],
// Cache Class
['cacheClass', 'required'],
['cacheClass', 'string', 'max' => 128],
// Application Tour
['appTour', 'boolean']
];
}
public function attributeLabels()
{
return [
'appName' => 'Application Name',
'appFrontendTheme' => 'Frontend Theme',
'appBackendTheme' => 'Backend Theme',
'cacheClass' => 'Cache Class',
'appTour' => 'Show introduction tour for new users'
];
}
}
像其他任何东西一样使用这个 Model
。
例如view.php
:
<?php
/**
* Created by PhpStorm.
* User: Abhimanyu
* Date: 18-02-2015
* Time: 16:47
*/
use abhimanyu\installer\helpers\enums\Configuration as Enum;
use yii\caching\DbCache;
use yii\caching\FileCache;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/** @var $this \yii\web\View */
/** @var $model \backend\models\BasicSettingForm */
/** @var $themes */
$this->title = 'Basic Settings - ' . Yii::$app->name;
?>
<div class="panel panel-default">
<div class="panel-heading">Basic Settings</div>
<div class="panel-body">
<?= $this->render('/alert') ?>
<?php $form = ActiveForm::begin([
'id' => 'basic-setting-form',
'enableAjaxValidation' => FALSE,
]); ?>
<h4>Application Settings</h4>
<div class="form-group">
<?= $form->field($model, 'appName')->textInput([
'value' => Yii::$app->config->get(
Enum::APP_NAME, 'Starter Kit'),
'autofocus' => TRUE,
'autocomplete' => 'off'
])
?>
</div>
<hr/>
<h4>Theme Settings</h4>
<div class="form-group">
<?= $form->field($model, 'appBackendTheme')->dropDownList($themes, [
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::APP_BACKEND_THEME, 'yeti') => ['selected ' => TRUE]
]
]) ?>
</div>
<div class="form-group">
<?= $form->field($model, 'appFrontendTheme')->dropDownList($themes, [
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::APP_FRONTEND_THEME, 'readable') => ['selected ' => TRUE]
]
]) ?>
</div>
<hr/>
<h4>Cache Setting</h4>
<div class="form-group">
<?= $form->field($model, 'cacheClass')->dropDownList(
[
FileCache::className() => 'File Cache',
DbCache::className() => 'Db Cache'
],
[
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::CACHE_CLASS, FileCache::className()) => ['selected ' => TRUE]
]
]) ?>
</div>
<hr/>
<h4>Introduction Tour</h4>
<div class="form-group">
<div class="checkbox">
<?= $form->field($model, 'appTour')->checkbox() ?>
</div>
</div>
<?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
<?php $form::end(); ?>
</div>
正如评论和其他答案中指出的那样,您的模型需要扩展 \yii\db\BaseActiveRecord. That said you can store your json as a nosql database such as MongoDb or in a key-value cache such as Redis instead. Both have Yii implementions: \yii\mongodb\ActiveRecord and \yii\redis\ActiveRecord
创建没有数据库后端的模型的轻量级方法是使用 DynamicModel:
DynamicModel is a model class primarily used to support ad hoc data validation.
只需在控制器中写入:
$model = new DynamicModel(compact('name', 'email'));
$model->addRule(['name', 'email'], 'string', ['max' => 128])
->addRule('email', 'email')
->validate();
然后将 $model 传递给您的视图。
可以在 http://www.yiiframework.com/wiki/759/create-form-with-dynamicmodel/ 中找到完整的示例。
这非常适合用于调用 API、动态创建表单等的用户输入。
我想创建一个没有数据库的 yii2 模型。相反,数据是动态生成的而不是存储的,只是作为 json 显示给用户。基本上,我只想得到一个简单的、基本的非数据库模型示例,但我找不到任何关于它的文档。
那么没有数据库怎么写模型呢?我已扩展 \yii\base\Model
但我收到以下错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<name>PHP Fatal Error</name>
<message>Call to undefined method my\app\models\Test::find()</message>
<code>1</code>
<type>yii\base\ErrorException</type>
<file>/my/app/vendor/yiisoft/yii2/rest/IndexAction.php</file>
<line>61</line>
<stack-trace>
<item>#0 [internal function]: yii\base\ErrorHandler->handleFatalError()</item>
<item>#1 {main}</item>
</stack-trace>
</response>
要实现 find()
,我必须 return 一个数据库查询对象。
我的模型完全是空白,我只是在寻找一个简单的例子来理解原理。
<?php
namespace my\app\models;
class Test extends \yii\base\Model{
}
使用模型的原因是对从某处获取的数据执行某种逻辑。模型可用于执行数据验证、模型的 return 属性及其标签,并允许进行大规模分配。如果您的数据模型不需要这些功能,请不要使用模型!
如果您不需要数据验证(即您不通过表单或其他外部来源更改任何数据),并且您不需要访问行为或事件,那么您可能只需要使用 yii\base\Object.这将使您能够访问对象属性的 getter 和 setter,这似乎就是您所需要的。
所以你的 class 最终看起来像这样。我已经包括从另一个模型获取数据,以防这是你想要做的;
<?php
namespace my\app\models;
use \path\to\some\other\model\to\use\OtherModels;
class Test extends \yii\base\Object{
public function getProperty1(){
return "Whatever you want property1 to be";
}
public function getProperty2(){
return "Whatever you want property2 to be";
}
public function getOtherModels(){
return OtherModels::findAll();
}
}
然后你就可以像这样简单地使用它;
$test = new Test;
echo $test->property1;
foreach ($test->otherModels as $otherModel){
\Do something
}
您尝试使用的函数 find() 仅与数据库相关,因此如果您扩展 yii\base\Model、yii\base\Component或yii\base\Object,除非你想自己定义这样的函数。
这是我的一个项目中的 Model
。此 Model
未连接任何数据库。
<?php
/**
* Created by PhpStorm.
* User: Abhimanyu
* Date: 18-02-2015
* Time: 22:07
*/
namespace backend\models;
use yii\base\Model;
class BasicSettingForm extends Model
{
public $appName;
public $appBackendTheme;
public $appFrontendTheme;
public $cacheClass;
public $appTour;
public function rules()
{
return [
// Application Name
['appName', 'required'],
['appName', 'string', 'max' => 150],
// Application Backend Theme
['appBackendTheme', 'required'],
// Application Frontend Theme
['appFrontendTheme', 'required'],
// Cache Class
['cacheClass', 'required'],
['cacheClass', 'string', 'max' => 128],
// Application Tour
['appTour', 'boolean']
];
}
public function attributeLabels()
{
return [
'appName' => 'Application Name',
'appFrontendTheme' => 'Frontend Theme',
'appBackendTheme' => 'Backend Theme',
'cacheClass' => 'Cache Class',
'appTour' => 'Show introduction tour for new users'
];
}
}
像其他任何东西一样使用这个 Model
。
例如view.php
:
<?php
/**
* Created by PhpStorm.
* User: Abhimanyu
* Date: 18-02-2015
* Time: 16:47
*/
use abhimanyu\installer\helpers\enums\Configuration as Enum;
use yii\caching\DbCache;
use yii\caching\FileCache;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/** @var $this \yii\web\View */
/** @var $model \backend\models\BasicSettingForm */
/** @var $themes */
$this->title = 'Basic Settings - ' . Yii::$app->name;
?>
<div class="panel panel-default">
<div class="panel-heading">Basic Settings</div>
<div class="panel-body">
<?= $this->render('/alert') ?>
<?php $form = ActiveForm::begin([
'id' => 'basic-setting-form',
'enableAjaxValidation' => FALSE,
]); ?>
<h4>Application Settings</h4>
<div class="form-group">
<?= $form->field($model, 'appName')->textInput([
'value' => Yii::$app->config->get(
Enum::APP_NAME, 'Starter Kit'),
'autofocus' => TRUE,
'autocomplete' => 'off'
])
?>
</div>
<hr/>
<h4>Theme Settings</h4>
<div class="form-group">
<?= $form->field($model, 'appBackendTheme')->dropDownList($themes, [
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::APP_BACKEND_THEME, 'yeti') => ['selected ' => TRUE]
]
]) ?>
</div>
<div class="form-group">
<?= $form->field($model, 'appFrontendTheme')->dropDownList($themes, [
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::APP_FRONTEND_THEME, 'readable') => ['selected ' => TRUE]
]
]) ?>
</div>
<hr/>
<h4>Cache Setting</h4>
<div class="form-group">
<?= $form->field($model, 'cacheClass')->dropDownList(
[
FileCache::className() => 'File Cache',
DbCache::className() => 'Db Cache'
],
[
'class' => 'form-control',
'options' => [
Yii::$app->config->get(Enum::CACHE_CLASS, FileCache::className()) => ['selected ' => TRUE]
]
]) ?>
</div>
<hr/>
<h4>Introduction Tour</h4>
<div class="form-group">
<div class="checkbox">
<?= $form->field($model, 'appTour')->checkbox() ?>
</div>
</div>
<?= Html::submitButton('Save', ['class' => 'btn btn-primary']) ?>
<?php $form::end(); ?>
</div>
正如评论和其他答案中指出的那样,您的模型需要扩展 \yii\db\BaseActiveRecord. That said you can store your json as a nosql database such as MongoDb or in a key-value cache such as Redis instead. Both have Yii implementions: \yii\mongodb\ActiveRecord and \yii\redis\ActiveRecord
创建没有数据库后端的模型的轻量级方法是使用 DynamicModel:
DynamicModel is a model class primarily used to support ad hoc data validation.
只需在控制器中写入:
$model = new DynamicModel(compact('name', 'email'));
$model->addRule(['name', 'email'], 'string', ['max' => 128])
->addRule('email', 'email')
->validate();
然后将 $model 传递给您的视图。
可以在 http://www.yiiframework.com/wiki/759/create-form-with-dynamicmodel/ 中找到完整的示例。
这非常适合用于调用 API、动态创建表单等的用户输入。