首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建没有数据库的Yii2模型

如何创建没有数据库的Yii2模型
EN

Stack Overflow用户
提问于 2015-02-24 15:50:00
回答 4查看 17.5K关注 0票数 10

我想要创建一个没有数据库的yii2模型。相反,数据是动态生成的,而不是存储的,只是以json的形式显示给用户。基本上,我只是想要一个简单的、基本的非数据库模型工作的例子,但是我找不到任何关于它的文档。

那么,如果没有数据库,我将如何编写模型呢?我已经扩展了\yii\base\Model,但是我得到了以下错误消息:

代码语言:javascript
复制
<?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(),我必须返回一个数据库查询对象。

我的模型完全是空白的,我只是在寻找一个简单的例子来理解主体。

代码语言:javascript
复制
<?php
namespace my\app\models;

class Test extends \yii\base\Model{
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-25 06:28:47

这是我的一个项目的Model。此Model不与任何数据库连接。

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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>

票数 17
EN

Stack Overflow用户

发布于 2015-02-25 05:57:02

使用模型的原因是对从某个地方获得的数据执行某种逻辑。模型可用于执行数据验证,返回模型及其标签的属性,并允许大量分配。如果数据模型不需要这些特性,那么就不要使用模型!

如果您不需要数据验证(即不通过表单或其他外部源更改任何数据),也不需要访问行为或事件,那么您可能只需要使用yii\base\Object。这将使您可以访问对象属性的getter和setter,这似乎是您所需要的。

所以你的课最后看起来像这样。我包括从另一个模型中获取数据,以防这是你想要做的;

代码语言:javascript
复制
<?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();
    }

}

然后你就这样简单地使用它;

代码语言:javascript
复制
$test = new Test;
echo $test->property1;
foreach ($test->otherModels as $otherModel){
    \\Do something
}

您尝试使用的函数find()仅与数据库相关,因此如果您扩展了yii\base\Model、yii\base\组件或yii\base\Object,那么该类将不可用,除非您想自己定义这样的函数。

票数 6
EN

Stack Overflow用户

发布于 2016-02-22 06:08:33

在没有数据库后端的情况下创建模型的一种轻量级方法是使用DynamicModel

DynamicModel是一个模型类,主要用于支持临时数据验证。

只需在你的控制器上写:

代码语言:javascript
复制
$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、动态创建表单等用户输入都是完美的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28700227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档