Yii2 – Как сделать AutoLoad для пользовательского класса?

Я создал следующий пользовательский класс, который я хотел бы использовать в своем приложении Yii2:

@ общий / компоненты / помощник / CustomDateTime.php

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

Я хочу использовать этот класс следующим образом:

 public function actionDelete($id) { $account = $this->findModel($id); $account->archived = 1; $account->archived_date = CustomDateTime::Now(); $account->save(); return $this->redirect(['index']); } - public function actionDelete($id) { $account = $this->findModel($id); $account->archived = 1; $account->archived_date = CustomDateTime::Now(); $account->save(); return $this->redirect(['index']); } 

В моем файле @ common / config / bootstrap.php я создал classMap в соответствии с этим http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html .

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

Но я получаю ошибку: Class 'app \ controllers \ myapp \ CustomDateTime' не найден

ВОПРОС: Как создать classMap, чтобы мне не приходилось использовать инструкцию use в начале каждого контроллера для доступа к моему пользовательскому классу?

В Yii 1.1 в конфигурационном файле была опция «импортировать» набор кода, чтобы файл класса мог быть автоматически загружен при его вызове.

РЕШЕНИЕ

Большое спасибо @Animir за перенаправление меня обратно в оригинальную документацию. http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html .

Я обнаружил, что могу использовать следующее в моем файле @ common / config / bootstrap.php

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

НО – он работает только тогда, когда файл CustomDateTime.php НЕ имеет объявленного пространства имен.

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

Solutions Collecting From Web of "Yii2 – Как сделать AutoLoad для пользовательского класса?"

Просто добавьте инструкцию use в файл, где вы используете класс.

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

Вы тоже можете сделать это без use

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

но для того, чтобы эта вещь была успешно выполнена, вы добавляете ниже в app/config/web.php (файл конфигурации)

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

Автоматическая загрузка в Yii 2 довольно проста. Вы можете использовать его, загрузив класс с помощью основного файла конфигурации. как

Вы создали свой класс в компонентах / helper / CustomDateTime.php. и теперь в вашем файле config / main.php в верхней части файла добавьте ниже код

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

Теперь ваш класс автозагружается в вашем проекте, где бы вы его ни использовали, вы можете использовать как в своем контроллере, так и в модели или виде

Просто используйте это

 CustomDateTime-><methodName>(); 

Попробуйте это, я использовал это в своем проекте.

Для refrence вы можете использовать эту ссылку. нажмите здесь

Я знаю, что уже давно этот вопрос задавали. Я наткнулся на это и поделился тем, что делаю.

Обычно я использую псевдоним после use вместо того, чтобы добавлять 100 строк операторов использования для каждой модели или объектов класса. Добавление classMap для многих классов, которые вы используете, на мой взгляд, не очень хорошая идея. Если вы это сделаете, вы просто добавите ненужное сопоставление, даже если вы не используете эти объекты.

Вот что я делаю

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

И в контроллере

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

Надеюсь это поможет 🙂