2015-01-30 7 views
12

Ich habe die folgende benutzerdefinierte Klasse erstellt, die ich in meiner Yii2 Anwendung verwenden mag:Yii2 - Wie lade ich eine benutzerdefinierte Klasse AutoLoad?

@ common/components/helper/CustomDateTime.php

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

Ich mag diese Klasse verwenden dies wie:

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

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

In meiner @ common/config/bootstrap.php Datei habe ich ein classMap erstellt diese http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html nach.

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

Aber ich erhalte die Fehlermeldung: Class 'app \ Controller \ myapp \ CustomDateTime' nicht gefunden

FRAGE: Wie erstelle ich einen classMap so, dass ich nicht zu Verwenden Sie die Verwendung Anweisung am Anfang jedes Controllers auf meine benutzerdefinierte Klasse zugreifen?

Yii 1.1 hatte eine Option in der Konfigurationsdatei, um einen Satz Code zu "importieren", so dass eine Klassendatei beim Aufruf automatisch geladen werden konnte.

SOLUTION

Vielen Dank an @Animir für mich zurück in die ursprüngliche Dokumentation umgeleitet wird. .

Ich fand, dass ich folgendes in meinem @ common/config/bootstrap.php Datei

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

ABER verwenden - es funktioniert nur, wenn die die CustomDateTime.php Datei nicht deklarierten Namespace .

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

So sind Sie eigentlich, dass überall mit oder einfach nur faul :)? Verwenden Sie auch eine bessere IDE, da gute IDEs die Datei automatisch enthalten, wenn Sie sie verwenden. –

+0

Ich bin noch neu bei PHP, also verstehe ich nicht ganz, was Lazy Loading bedeutet. Mein Ziel ist es, den oberen Teil jeder PHP-Datei nicht mit einer langen Liste von Benutzungsanweisungen zu belegen. – zDaniels

+1

Ich sprach nicht von faulen Laden Ich habe davon gesprochen, dass du faul bist. Sie können das möglicherweise nicht in jeder Klasse benötigen (es sei denn, was Sie tun wollen, ist unglaublich dumm). Erfahren Sie, wie Namespaces funktionieren oder zur prozeduralen Programmierung gehen. –

Antwort

5

Fügen Sie einfach use Anweisung in Datei hinzu, wo Sie eine Klasse verwenden.

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

Genau das versuche ich zu vermeiden. Ich möchte die Anweisung ** use ** nicht für jede Klasse verwenden, die ich referenzieren möchte. – zDaniels

+0

Er möchte Bootstrap Autoloader. – TNC

+0

Yii2 Autoload basiert auf Namespaces Autoload. Suchen Sie PSR-Standards, wenn Sie nicht wissen, wie es funktioniert. Aber wenn Sie Yii2 Weg nicht verwenden möchten, können Sie einfach 'require_once' Funktion in' bootstrap.php' verwenden, um Datei mit Klasse zu integrieren. – Animir

0

Auto laden in Yii 2 ist ziemlich einfach. Sie können es verwenden, indem Sie die Klasse mit der Konfigurationshauptdatei laden. wie

Sie haben Ihre Klasse in Komponenten/helper/CustomDateTime.php erstellt. und jetzt in Ihrer config/main.php in dem Anfang der Datei unter Code hinzufügen

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

Jetzt ist Ihre Klasse in Ihrem Projekt automatisch geladen wird, wo immer Sie wollen, es benutzen Sie können wie verwenden in Ihrem Controller, Modell oder Ansicht

verwenden Sie einfach wie diese

CustomDateTime-><methodName>(); 

Versuchen Sie, diese habe ich verwendet dieses in meinem Projekt.

Für Referenz können Sie diesen Link verwenden.Klicken here

2

Sie this Art und Weise tun können, auch ohne die Verwendung von use

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

aber für diese Sache erfolgreich durchgeführt, um Sie fügen unten zu app/config/web.php (die Konfigurationsdatei)

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

Ich weiß, dass diese Frage schon lange gestellt wurde. Ich bin darauf gestoßen und teile, was ich mache.

Normalerweise verwende ich einen Alias ​​nach der use-Anweisung, anstatt 100 Zeilen für die Verwendung von Anweisungen für jedes Modell oder Klassenobjekte hinzuzufügen. Das Hinzufügen von classMap für viele der von Ihnen verwendeten Klassen ist aus meiner Sicht keine gute Idee. Wenn Sie das tun, fügen Sie einfach unnötiges Mapping hinzu, selbst wenn Sie diese Objekte nicht verwenden.

Hier ist, was ich tun

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

Und in der Steuerung

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'); 
     } 
    } 
} 

this helps :)

Verwandte Themen