web-dev-qa-db-fra.com

Yii2 - Comment charger automatiquement une classe personnalisée?

J'ai créé la classe personnalisée suivante que j'aimerais utiliser dans mon application Yii2:

(@ common/components/helper/CustomDateTime.php} _

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

Je veux utiliser cette classe comme ceci:

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

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

Dans mon fichier @ common/config/bootstrap.php, j'ai créé un classMap conformément à ceci http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html

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

Mais je reçois le message d'erreur suivant: Classe 'app\controllers\myapp\CustomDateTime' non trouvée

QUESTION: Comment créer un classMap afin de ne pas avoir à utiliser l'instruction use au début de chaque contrôleur pour accéder à ma classe personnalisée?

Yii 1.1 avait l'habitude d'avoir une option dans le fichier de configuration pour «importer» un ensemble de code afin qu'un fichier de classe puisse être chargé automatiquement lors de son appel.

SOLUTION

Merci beaucoup à @Animir de m'avoir redirigé vers la documentation d'origine. http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html

J'ai constaté que je pouvais utiliser les éléments suivants dans mon fichier @ common/config/bootstrap.php

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

MAIS - cela ne fonctionne que lorsque le fichier CustomDateTime.php N'A PAS un espace de noms déclaré.

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

Ajoutez simplement une instruction use dans un fichier, où vous utilisez une classe.

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

Le chargement automatique dans Yii 2 est assez facile. Vous pouvez l'utiliser en chargeant la classe avec le fichier principal de configuration. comme

Vous avez créé votre classe dans components/helper/CustomDateTime.php. et maintenant dans votre config/main.php en haut du fichier, ajoutez le code ci-dessous

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

Maintenant, votre classe est automatiquement chargée dans votre projet, où que vous soyez, vous pouvez l'utiliser comme dans votre contrôleur, votre modèle ou votre vue.

Il suffit d'utiliser comme ça

CustomDateTime-><methodName>();

Essayez ceci, je l'ai utilisé dans mon projet.

Pour référence, vous pouvez utiliser ce lien. cliquez ici

0
Neeraj Kumar

Je sais que cela fait longtemps que cette question a été posée. Je suis tombé sur cela et pour partager ce que je fais.

J'utilise généralement un alias après une instruction use au lieu d'ajouter 100 lignes d'instructions d'utilisation pour chaque objet de modèle ou de classe. L'ajout de classMap pour la plupart des classes que vous utilisez n'est pas une bonne idée à mon avis. Si vous faites cela, vous ajouterez simplement un mappage inutile, même lorsque vous n'utilisez pas ces objets.

Voici ce que je fais

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

Et dans le contrôleur

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

J'espère que cela t'aides :)

0
Mir