2015-02-24 2 views
8

Я хотел бы создать модель yii2 без базы данных. Вместо этого данные генерируются динамически и не сохраняются, просто отображаются пользователю как json. В принципе, я просто хотел бы получить простой, базовый пример работы с моделью без базы данных, но я не могу найти на ней никакой документации.Как создать модель Yii2 без базы данных

Так как бы я написал модель без базы данных? Я продлил \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(), я должен возвращать объект запроса к базе данных.

Моя модель полностью пустая, я просто ищу простой пример, чтобы понять принципала.

<?php 
namespace my\app\models; 

class Test extends \yii\base\Model{ 
} 
+2

Не понимаю. Если вам не нужна база данных, почему вам нужно реализовать метод 'find()'? Он используется в 'yii \ db \ ActiveRecord'. Используйте 'yii \ base \ Model'. – arogachev

+0

@arogachev Я сейчас обновил вопрос, добавляет ли я определенность? –

+0

'find()' существует только в 'yii \ db \ ActiveRecord'. Что вы хотите искать? – arogachev

ответ

10

Это 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> 

+0

Это работает так, как я надеялся. Благодарю. –

6

Причина использования модели заключается в выполнении некоторой логики данных, которые вы получаете откуда-то. Модель может использоваться для проверки достоверности данных, возврата свойств модели и их меток и допускает массивное присвоение. Если вам не нужны эти функции для вашей модели данных, тогда не используйте модель!

Если вам не нужна проверка данных (т. Е. Вы не меняете данные с помощью форм или другого внешнего источника), и вам не нужен доступ к поведению или событиям, вам, вероятно, нужно просто использовать yii \ base \ Object , Это даст вам доступ к геттерам и сеттерам для свойств объекта, которые, кажется, все, что вам нужно.

Итак, ваш класс выглядит так. Я включил получение данных из другой модели, если это то, что вы хотите сделать;

<?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 
} 

Функция вы пытались использовать, найти(), имеет отношение только к базе данных, и поэтому не будут доступны для вашего класса, если вы продлили юй \ база \ Model, юй \ база \ Component или yii \ base \ Object, если вы не хотите сами определять такую ​​функцию.

1

Как было отмечено в комментариях и другие ответы, ваша модель должна распространяться \yii\db\BaseActiveRecord. Тем не менее, вы можете сохранить ваш json в качестве базы данных nosql, такой как MongoDb, или в кеше ключевого значения, например Redis. Оба имеют Yii implementions: \yii\mongodb\ActiveRecord и \yii\redis\ActiveRecord

+0

MongoDb и Redis, безусловно, две вещи, на которые я посмотрю. Спасибо за предложение. –

3

Легкий способ создания модели без буфера базы данных является использование DynamicModel:

DynamicModel класс модель в основном используется для поддержки специальной проверки данных.

Просто напишите в контроллере:

$model = new DynamicModel(compact('name', 'email')); 
$model->addRule(['name', 'email'], 'string', ['max' => 128]) 
    ->addRule('email', 'email') 
    ->validate(); 

, а затем передать $ модель на ваш взгляд.

Полный пример можно найти в http://www.yiiframework.com/wiki/759/create-form-with-dynamicmodel/.

Это идеальное решение для ввода пользователем для вызова API, создания форм «на лету» и т. Д.

Смежные вопросы