Yii2 - How do I AutoLoad a custom class?

2020-08-11 10:37发布

问题:

I have created the following custom class that I'd like to use in my Yii2 application:

@common/components/helper/CustomDateTime.php

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

I want to use this class like this:

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

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

In my @common/config/bootstrap.php file I've created a classMap according to this http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html.

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

But I am getting the error: Class 'app\controllers\myapp\CustomDateTime' not found

QUESTION: How do I create a classMap so that I don't have to use the use statement at the beginning of every controller to access my custom class?

Yii 1.1 used to have an option in the config file to 'import' a set of code so that a class file could be autoloaded when it was called.

SOLUTION

Many thanks to @Animir for redirecting me back to the original documentation. http://www.yiiframework.com/doc-2.0/guide-concept-autoloading.html.

I found that I can use the following in my @common/config/bootstrap.php file

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

BUT - it only works when the the CustomDateTime.php file does NOT have a declared namespace.

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

回答1:

Just add use statement in file, where you use a class.

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


回答2:

You can do this way too without the use of use

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

but for this thing to get accomplished successfully you add below to app/config/web.php (the config file)

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


回答3:

Auto load in Yii 2 is pretty easy. You can use it by loading the class with config main file. like

You have created your class in components/helper/CustomDateTime.php . and now in your config/main.php in the top of the file add below code

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

Now your class is autoloaded in your project where ever you want to use it you can use like in your controller,model or view

Simply use like this

CustomDateTime-><methodName>();

Try this i have used this in my project.

For refrence you can use this link. click here



回答4:

I know it's been long since this question was asked. I came across this and to share what I do.

I usually use an alias after use statement instead of adding 100 of lines of use statements for each model or class objects. Adding classMap for many of the classes that you use is not a good idea in my view. If you do that you'll be just adding unnecessary mapping even when you are not using those objects.

Here's what I do

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

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

Hope this helps :)



标签: php yii2