2015-01-30 12 views
12

Ho creato la seguente classe personalizzata che mi piacerebbe utilizzare nella mia richiesta Yii2:Yii2 - Come si carica automaticamente una classe personalizzata?

@ comune/componenti/assistente/CustomDateTime.php

namespace common\components\helper; 
class CustomDateTime{function Now() {...}} 

voglio usare questa classe in questo modo:

public function actionDelete($id) 
{ 
    $account = $this->findModel($id); 
    $account->archived = 1; 
    $account->archived_date = CustomDateTime::Now(); 
    $account->save(); 

    return $this->redirect(['index']); 
} 

Nel mio @ file comune/config/bootstrap.php ho creato un classMap secondo questa http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html.

Yii::$classMap['CustomDateTime'] = '@common/components/helper/CustomDateTime.php'; 

Ma sto ottenendo l'errore: Class 'app \ controller \ myapp \ CustomDateTime' non trovato

DOMANDA: Come faccio a creare un classMap in modo che io non devo utilizzare l'istruzione all'inizio di ogni controller per accedere alla mia classe personalizzata?

Yii 1.1 utilizzato per avere un'opzione nel file di configurazione per "importare" un set di codice in modo che un file di classe possa essere caricato automaticamente quando è stato chiamato.

SOLUZIONE

Molte grazie a @Animir per me reindirizzare indietro alla documentazione originale. http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html.

ho trovato che posso utilizzare il seguente nel mio @ comune/config/bootstrap.php file di

Yii::$classMap['CustomDateTime'] = '@common/components/helper/CustomDateTime.php'; 

MA - funziona solo quando il file del CustomDateTime.php non ha un namespace dichiarato .

//namespace common\components\helper; 
class CustomDateTime{function Now() {...}} 
+2

Quindi stai effettivamente utilizzando che ovunque o semplicemente pigri :)? Usa anche un IDE migliore perché i buoni IDE includeranno automaticamente il file quando lo utilizzi. –

+0

Sono ancora nuovo su php, quindi non capisco appieno il significato di caricamento pigro. Il mio obiettivo è non ingombrare la parte superiore di ogni file php con una lunga lista di istruzioni d'uso. – zDaniels

+1

Non stavo parlando di carico pigro, stavo parlando di te che sei pigro. Non puoi averne bisogno in ogni classe (a meno che quello che vuoi fare sia incredibilmente stupido). Scopri come funzionano gli spazi dei nomi o vai alla programmazione procedurale. –

risposta

5

Basta aggiungere l'istruzione use nel file, in cui si utilizza un corso.

use common\components\helper\CustomDateTime; 
/* some code */ 
public function actionDelete($id) 
{ 
    $dateNow = CustomDateTime::Now(); 
    /* some code */ 
} 
/* some code */ 
+1

Questo è esattamente quello che sto cercando di evitare. Non voglio usare l'istruzione ** use ** per ogni classe a cui voglio fare riferimento. – zDaniels

+0

Vuole il caricatore automatico di avvio. – TNC

+0

Autoload Yii2 basato sul caricamento automatico dei namespace. Guarda gli standard PSR se non sai come funziona. Ma se non si vuole usare Yii2 way, si può semplicemente usare la funzione 'require_once' in' bootstrap.php' per includere file con classe. – Animir

0

Il carico automatico in Yii 2 è piuttosto semplice. Puoi usarlo caricando la classe con il file principale di configurazione. come

Hai creato la tua classe in components/helper/CustomDateTime.php. e ora nel tuo config/main.php nella parte superiore del file aggiungere sottostante Codice

require_once(dirname(__FILE__) . '/../components/helper/CustomDateTime.php'); 

Ora la vostra classe viene caricata automaticamente nel progetto dove mai si desidera utilizzarlo è possibile utilizzare come nel controller, modello o vista

sufficiente utilizzare come questo

CustomDateTime-><methodName>(); 

Prova questo ho utilizzato nel mio progetto.

Per refrence è possibile utilizzare questo collegamento.fare clic here

2

Si può fare this troppo senza l'uso di use

Yii::$app->cdt->Now(); // cdt - CustomDateTime

ma per questa cosa per ottenere compiuto con successo si aggiunge qui sotto per app/config/web.php (file di configurazione)

... 
'components' => [ 
    'cdt' => [ 
     'class' => 'common\components\helper\CustomDateTime', 
    ], 
    ... 
] 
... 
0

So che è passato molto tempo da quando è stata posta questa domanda. Mi sono imbattuto in questo e per condividere quello che faccio.

Io di solito uso un alias dopo l'istruzione use invece di aggiungere 100 righe di istruzioni use per ogni oggetto modello o classe. L'aggiunta di classMap per molte delle classi che usi non è una buona idea secondo me. Se lo fai, aggiungerai la mappatura non necessaria anche quando non utilizzi questi oggetti.

Ecco quello che faccio

use Yii; 
use common\helpers as Helper; 
use yii\helpers as YiiHelper; 
use common\models as Model; 
use common\components as Component; 

E nel controller

public function actionIndex(){ 
    $model = Model\SomeModel(); 

    if(Yii::$app->request->isPost){ 
     $post = Yii::$app->request->post('SomeModel'); 
     $model->text = Helper\Text::clean($post['text']); 
     $model->text = YiiHelper\Html::encode($model->text); 

     if($model->save()){ 
      return $this->render('thank_you'); 
     } 
    } 
} 

Spero che questo aiuti :)

Problemi correlati