Ответ 1
Просто добавьте инструкцию use
в файл, где вы используете класс.
use common\components\helper\CustomDateTime;
/* some code */
public function actionDelete($id)
{
$dateNow = CustomDateTime::Now();
/* some code */
}
/* some code */
Я создал следующий пользовательский класс, который я хотел бы использовать в своем приложении 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() {...}}
Просто добавьте инструкцию 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 довольно проста. Вы можете использовать его, загрузив класс с помощью основного файла конфигурации. как
Вы создали свой класс в компонентах/помощнике/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');
}
}
}
Надеюсь, что это поможет:)