wake-up-neo.net

Yii2 - Wie lade ich eine benutzerdefinierte Klasse automatisch?

Ich habe die folgende benutzerdefinierte Klasse erstellt, die ich in meiner Yii2-Anwendung verwenden möchte:

@ common/components/helper/CustomDateTime.php

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

Ich möchte diese Klasse so verwenden:

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 eine classMap gemäß dieser http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html erstellt. 

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

Ich erhalte jedoch die Fehlermeldung: Klassen-App\Controller\Myapp\CustomDateTime 'nicht gefunden

FRAGE: Wie erstelle ich eine classMap, damit ich nicht am Anfang jedes Controllers die Anweisung use verwenden muss, um auf meine benutzerdefinierte Klasse zuzugreifen?

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

LÖSUNG

Vielen Dank an @Animir für die Rückführung auf die Originaldokumentation. http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html

Ich habe festgestellt, dass ich Folgendes in meiner @ common/config/bootstrap.php -Datei verwenden kann

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

ABER - es funktioniert nur, wenn die CustomDateTime.php-Datei NICHT über einen deklarierten Namespace verfügt.

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

Fügen Sie einfach eine use-Anweisung in die Datei ein, in der Sie eine Klasse verwenden.

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

Sie können this auch ohne die Verwendung von use

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

damit dies jedoch erfolgreich ist, fügen Sie unten app/config/web.php (die Konfigurationsdatei) hinzu.

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

Das automatische Laden in Yii 2 ist ziemlich einfach. Sie können es verwenden, indem Sie die Klasse mit der config-Hauptdatei laden. mögen

Sie haben Ihre Klasse in components/helper/CustomDateTime.php erstellt. und nun in deiner config/main.php oben in der Datei den Code hinzufügen

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

Jetzt wird Ihre Klasse automatisch in Ihr Projekt geladen, wo immer Sie sie verwenden möchten, wie Sie es in Ihrem Controller, Modell oder Ihrer Ansicht verwenden können

Verwenden Sie einfach so

CustomDateTime-><methodName>();

Versuchen Sie dies, ich habe es in meinem Projekt verwendet.

Zur Information können Sie diesen Link verwenden. klick auf hier

0
Neeraj Kumar

Ich weiß, dass diese Frage schon lange nicht mehr gestellt wurde. Ich bin auf dieses Thema gestoßen und möchte mitteilen, was ich mache.

Normalerweise verwende ich nach der use-Anweisung einen Alias, anstatt für jedes Modell oder jedes Klassenobjekt 100 Verwendungszeilen-Anweisungen hinzuzufügen. Das Hinzufügen von classMap für viele der von Ihnen verwendeten Klassen ist aus meiner Sicht keine gute Idee. Wenn Sie dies tun, fügen Sie nur unnötige Zuordnungen hinzu, auch wenn Sie diese Objekte nicht verwenden.

Hier ist was ich mache

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

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

Hoffe das hilft :)

0
Mir