yii2 переопределние базового класса через classMap

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

yii2 переопределние базового класса через classMap

Сообщение Insolita »

Нашла в гайде как можно класс переопределить http://stuff.cebe.cc/yii2docs/guide-hel ... er-classes
Но чё-то не получается... я хочу переопределить класс базового Валидатора во входном после включения yii пишу

Код: Выделить всё

Yii::$classMap['yii/validators/Validator'] = __DIR__ .'/../common/ExValidator.php';
но чё-то ничего не происходит - или базовый не переопределить, только наследников можно? Или я не поняла чего-то?
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

разобралась, надо было

Код: Выделить всё

Yii::$classMap['yii\validators\Validator'] = __DIR__ .'/../common/ExValidator.php';
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

В Yii2 появился IoC контейнер, можно классы и объекты через него переписывать, а не через костыль с classMap
Жду Yii 3!
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

через контейнер - это как Yii::$container->set ? или что за "IoC" ? Локатор
через контейнер смотрела, но что-то по документации не поняла как именно класс переопределить - там примеры для дополнения интерфейсом, или дефолтных настроек класса
Или через него можно функции переопределять?

тут фишка то еще в том что от этого класа наследуется куча всего

ну через классмап фактически переопределить получилось, но не работает, ругается - 'yii\base\UnknownClassException' with message 'Unable to find 'yii\validators\Validator' in file: /home/insolita/www/data/vg/web/../common/ExValidator.php. Namespace missing?'

В общем примерчик бы, если можно...
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

Не заметил, что ты хочешь базовый класс для всех валидаторов переопределить.
Не уверен что ты сможешь подменить базовый класс.
Жду Yii 3!
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

ну у меня тоже были сомнения.... а если не базовый, то как не через classMаp а через контейнер переопределять? к примеру NumberValidator
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

негде сейчас попробовать, но думаю так должно работать

Код: Выделить всё

\Yii::$container->set(
  'yii\validators\ NumberValidator', 
  'common\validators\NumberValidator'
); 
или

Код: Выделить всё

\Yii::$container->set(
  'yii\validators\ NumberValidator',
  ['class' => 'common\validators\NumberValidator']
); 
Жду Yii 3!
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

ага, второй вариант работает, если не на базоваом валидаторе, я с базовым так пробовала и реакции никакой не происходила, поэтому решила что это не работает
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: yii2 переопределние базового класса через classMap

Сообщение lynicidn »

базовый через классМап, так же можно хелперы подменять
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

lynicidn писал(а):базовый через классМап, так же можно хелперы подменять
Подменить через classMap можно, но новый класс невозможно унаследовать от старого, т.к. новый должен иметь то же имя класса и даже неймспейс.

Тут нужно понимать что происходит.

Когда мы запрашиваем класс, например \yii\validators\Validator, автолодеры пытаются загрузить класс, если еще не загружен. Когда доходит очередь до автолоадера Yii, он читает файл из classMap, т.к. знает что нужный класс именно в этом файле. Тем самым подменив путь, мы лишь указываем новый файл, но с тем же классом.

С контейнером, другое дело. Контейнер задействан при создании объект, через createComponent. При таком создании объекта, Yii берет настройки из настроек контейнера.
Жду Yii 3!
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: yii2 переопределние базового класса через classMap

Сообщение lynicidn »

до автолоадера дело не дойдет, т.е. если я в index.php объявлю yii\helpers\Url, то автолоадер не будет его искать согласно алиаса, а возьмет уже подгруженный, так же и с классМап, если ты его пропишешь он не будет искать его согласно алиаса, а просто возьмет из мап
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

classMap используется только в автолоадере Yii, и конечно если ты загрузишь класс в index.php  то автолодеры не будут задействованы, т.к. класс уже известен. Так же можно загрузить класс через composer'ский автолоадер, тогда тоже класс будет известен и други автолоадеры (например Yii) тоже не сработают.

Это не меняет то момента что подменить класс который унаследован от себя же, как хотел топикстартер не получится.
С хелперами другая история там для LSB, созданы базовый классы и пустые классы унаследованные от базовый специально для этой цели. Чтоб можно было подменить Html, но унаследоваться от BaseHtml.

Топик стартер хотел сделать свой \yii\validators\Validator, и унаследоватся от стандартного \yii\validators\Validator.
Жду Yii 3!
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

Топик стартер хотел сделать свой \yii\validators\Validator, и унаследоватся от стандартного \yii\validators\Validator.
да нет, я не до такой степени блондинка, мой базовый от Component наследуется т.е. повторяет базовый валидатора
Последний раз редактировалось Insolita 2014.08.01, 01:59, всего редактировалось 1 раз.
Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение Insolita »

Кстати Проканало :-))) в namespace дело было - я указала namespace yii\validators и в конфиге задала алиас 'yii\validators\Validator' => '@app/common/Validator', классмап соответственно после загрузки конфига.
жёстко конечно, но работает.
Последний раз редактировалось Insolita 2014.08.01, 02:03, всего редактировалось 1 раз.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: yii2 переопределние базового класса через classMap

Сообщение lynicidn »

Insolita писал(а):Кстати Проканало :-))) в namespace дело было - я указала namespace yii\validators и в конфиге задала алиас 'yii\validators\Validator' => '@app/common/Validator', классмап соответственно после загрузки конфига
жёстко конечно, но работает.
а в общем-то оно так и вообще без classmap работает... правда на локалке, как в вебе не знаю
ничего жестокого, для этих целей я так и понимаю это сделано, по другомы не перегрузить классы
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

Insolita писал(а):да нет, я не до такой степени блондинка, мой базовый от Component наследуется т.е. повторяет базовый валидатора
Без обид, я не думал никого обидеть, просто сделал поспешный вывод, по этой ошибке что что-то не так у тебя в ExValidator.php
ну через классмап фактически переопределить получилось, но не работает, ругается - 'yii\base\UnknownClassException' with message 'Unable to find 'yii\validators\Validator' in file: /home/insolita/www/data/vg/web/../common/ExValidator.php. Namespace missing?'
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

Insolita писал(а):Кстати Проканало :-))) в namespace дело было - я указала namespace yii\validators и в конфиге задала алиас 'yii\validators\Validator' => '@app/common/Validator', классмап соответственно после загрузки конфига.
жёстко конечно, но работает.
Да жестко, только теперь он все классы из этого пространства будет искать по новому пути, кроме тех что есть в classMap, т.е. со стандартными валидаторами сработает, но не стоит к этому привыкать.

Лучше сразу пересмотреть свою задачу и придумать правильное решение а не костыль :(
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: yii2 переопределние базового класса через classMap

Сообщение slavcodev »

Что такого особенного тебе понадобилось, чтоб подделывать базовый Validator?
Жду Yii 3!
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: yii2 переопределние базового класса через classMap

Сообщение lynicidn »

не понял сейчас - а как это отразится на других классах? ведь алиасы не перегружены, все будет работать как прежде, классмап это своего рода исключения
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: yii2 переопределние базового класса через classMap

Сообщение lynicidn »

slavcodev писал(а):Что такого особенного тебе понадобилось, чтоб подделывать базовый Validator?
плюсую, хороший вопрос
Ответить