Подтвердить что ты не робот

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

В моем файле @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() {...}}
4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете сделать этот тоже без использования use

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

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

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

Ответ 3

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

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

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

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

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

CustomDateTime-><methodName>();

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

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

Ответ 4

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

Я обычно использую псевдоним после инструкции 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');
       }
   }
}

Надеюсь, что это поможет:)