12
votes

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() {...}}
4
So are you actually using that everywhere or just lazy :)? Also use a better IDE because good IDEs will automatically include the file when you use it. - Mihai P.
I'm still new to php, so I don't fully understand what lazy loading means. My goal is to not clutter the top of every php file with a long list of use statements. - zDaniels
I was not talking about lazy loading I was talking about you being lazy. You cannot possibly need that in every class (unless what you want to do is incredibly dumb). Learn how namespaces work or go to procedural programming. - Mihai P.

4 Answers

5
votes

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 */
4
votes

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',
    ],
    ...
]
...
1
votes

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

0
votes

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 :)