2015-02-24 2 views
8

Vorrei creare un modello yii2 senza un database. Invece, i dati sono generati dinamicamente e non memorizzati, appena visualizzati all'utente come un json. Fondamentalmente, vorrei solo ottenere un semplice esempio di base di un modello non di database funzionante, ma non riesco a trovare alcuna documentazione su di esso.Come creare un modello Yii2 senza database

Quindi come scrivere un modello senza un database? Ho esteso \yii\base\Model ma ottengo il seguente messaggio di errore:

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

Per implementare find(), devo restituire un oggetto di query di database.

Il mio modello è completamente vuoto, sto solo cercando un semplice esempio per capire il principale.

<?php 
namespace my\app\models; 

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

non capisco. Se non hai bisogno di un database, perché devi implementare il metodo 'find()'? È usato in 'yii \ db \ ActiveRecord'. Usa 'yii \ base \ Modello'. – arogachev

+0

@arogachev Ho aggiornato la domanda ora, aggiunge un po 'di chiarezza? –

+0

'find()' esiste solo in 'yii \ db \ ActiveRecord'. Cosa vuoi cercare? – arogachev

risposta

10

Questo è uno Model da uno dei miei progetti. Questo non è connesso con nessun database.

<?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' 
     ]; 
    } 
} 

Utilizzare questo Model come qualsiasi altro. ad es. 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

Funziona proprio come speravo. Grazie. –

6

Il motivo dell'utilizzo di un modello è eseguire una sorta di logica sui dati che si ottengono da qualche parte. Un modello può essere utilizzato per eseguire la convalida dei dati, restituire le proprietà del modello e le relative etichette e consente un'assegnazione massiccia. Se non hai bisogno di queste funzionalità per il tuo modello di dati, non utilizzare un modello!

Se non si richiede la convalida dei dati (ovvero non si modificano dati tramite moduli o altra fonte esterna) e non si richiede l'accesso a comportamenti o eventi, è probabile che sia necessario utilizzare solo yii \ base \ Object . Questo ti darà accesso a getter e setter per le proprietà dell'oggetto, che sembra essere tutto ciò di cui hai bisogno.

Così la tua classe finisce così. Ho incluso il recupero dei dati da un altro modello, nel caso in cui sia quello che vuoi fare;

<?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(); 
    } 

} 

Si dovrebbe quindi semplicemente utilizzare in questo modo;

$test = new Test; 
echo $test->property1; 
foreach ($test->otherModels as $otherModel){ 
    \\Do something 
} 

La funzione si è tentato di utilizzare, find(), è rilevante solo per un database e quindi non saranno disponibili per la classe se hai esteso Yii \ base \ modello, Yii \ base \ Componente o yii \ base \ Oggetto, a meno che tu non voglia definire autonomamente tale funzione.

1

Come è stato sottolineato nei commenti e altre risposte, il tuo modello ha la necessità di estendere la \yii\db\BaseActiveRecord. Detto questo, puoi archiviare il tuo json come database nosql come MongoDb o in una cache con valori-chiave come Redis. Entrambi hanno implementions Yii: \yii\mongodb\ActiveRecord e \yii\redis\ActiveRecord

+0

MongoDb e Redis sono certamente due cose che dovrò dare un'occhiata. Grazie per il suggerimento. –

3

Un modo leggero per creare modelli senza back-end del database è quello di utilizzare un DynamicModel:

DynamicModel è una classe del modello utilizzato principalmente per sostenere ad hoc la convalida dei dati.

Basta scrivere nel controller:

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

e poi passare $ modello per la visualizzazione.

Un esempio completo può essere trovato in http://www.yiiframework.com/wiki/759/create-form-with-dynamicmodel/.

Questo è perfetto per l'input dell'utente per la chiamata API, la creazione di forme al volo, ecc