Ошибка: "Циклическое наследование" в Engine autoload

Здравствуйте, на одном из проектов у меня выскочила ошибка «циклического наследования».
Что я имею в виду:
При попытке вызова функции $this->User_GetUserById(....);
получаю ошибку
PHP Fatal error:  Class 'PluginAdminusers_Inherit_ModuleUser_EntityUser' not found in /var/www/augme/www/plugins/adminusers/classes/mo
dules/user/entity/User.entity.class.php on line 11

И эта ошибка не устраняется при отключении плагина. При дальнейшем исследовании проблемы установил print на функцио Engine::autoload:

	/**
	 * Автозагрузка классов
	 *
	 * @param string $sClassName	Название класса
	 * @return bool
	 */
	public static function autoload($sClassName) {
		$aInfo = Engine::GetClassInfo(
			$sClassName,
			Engine::CI_CLASSPATH|Engine::CI_INHERIT
		);
		if($aInfo[Engine::CI_INHERIT]){
			$sInheritClass = $aInfo[Engine::CI_INHERIT];
			$sParentClass = Engine::getInstance()->Plugin_GetParentInherit($sInheritClass);
>>>>>>>>>>>>>>>>	print "{$sClassName}::{$sParentClass}\n";
			if(!class_alias($sParentClass,$sClassName)){
				dump("(autoload $sParentClass) Can not load CLASS-file");
			} else {
				return true;
			}
		}elseif($aInfo[Engine::CI_CLASSPATH]){
			require_once $aInfo[Engine::CI_CLASSPATH];
			return true;
		}elseif(!class_exists($sClassName)){
			dump("(autoload $sClassName) Can not load CLASS-file");
			dump($aInfo);
			//throw new Exception("(autoload '$sClassName') Can not load CLASS-file");
		}
		return false;
	}

И получил следующий вывод:

PluginTgroups_Inherit_ModuleUser_EntityUser::PluginAuras_ModuleUser_EntityUser
PluginAuras_Inherit_ModuleUser_EntityUser::PluginGmetourn_ModuleUser_EntityUser
PluginGmetourn_Inherit_ModuleUser_EntityUser::PluginInventory_ModuleUser_EntityUser
PluginInventory_Inherit_ModuleUser_EntityUser::PluginGmeprofileactivity_ModuleUser_EntityUser
PluginGmeprofileactivity_Inherit_ModuleUser_EntityUser::PluginTranslatetosocial_ModuleUser_EntityUser
PluginTranslatetosocial_Inherit_ModuleUser_EntityUser::PluginGmemoderator_ModuleUser_EntityUser
PluginGmemoderator_Inherit_ModuleUser_EntityUser::PluginGmestuff_ModuleUser_EntityUser
PluginGmestuff_Inherit_ModuleUser_EntityUser::PluginGmetags_ModuleUser_EntityUser
PluginGmetags_Inherit_ModuleUser_EntityUser::PluginExp_ModuleUser_EntityUser
PluginExp_Inherit_ModuleUser_EntityUser::PluginSitemap_ModuleUser_EntityUser
PluginSitemap_Inherit_ModuleUser_EntityUser::PluginUsermedals_ModuleUser_EntityUser
PluginUsermedals_Inherit_ModuleUser_EntityUser::PluginAnonymousaccess_ModuleUser_EntityUser
PluginAnonymousaccess_Inherit_ModuleUser_EntityUser::PluginAdminusers_ModuleUser_EntityUser
PluginAdminusers_Inherit_ModuleUser_EntityUser::PluginTgroups_ModuleUser_EntityUser

Подскажите, в какую сторону копать?
Версия движка 1.0.3

13 комментариев

avatar
Это одна из любимых ошибок ейсадминки (один из многочисленных вариантов), раньше она была включена?
кеш включен?
avatar
Проблему решил. Проблема была в особенностях использования самого LiveStreet. А именно пробовал тестировать плагин через Behat с использованием phantomjs на основе мануала от stfalcon . Но там была ошибка в инициализации контекста
avatar
Решил АПнуть темку т.к. тот рецепт не помог, а прямо в движке сделал проверку на двойное добавление в стек:
	public function Inherit($sFrom,$sTo,$sSign=__CLASS__) {
		if(!is_string($sSign) or !strlen($sSign)) return null;
		if(!$sFrom or !$sTo) return null;
		if(isset($this->aInherits[trim($sFrom)])){
			foreach($this->aInherits[trim($sFrom)]['items'] as $aRow){
				if($aRow['inherit'] == trim($sTo)){
					return null;
				}
			}
		}
		$this->aInherits[trim($sFrom)]['items'][]=array(
			'inherit'=>trim($sTo),
			'sign'=>$sSign
		);
		$this->aInherits[trim($sFrom)]['position']=count($this->aInherits[trim($sFrom)]['items'])-1;
	}
avatar
это лечение последствий? а причина какая?
avatar
Да, это лечение последствий, причину пока смотрю, в теории 2 раза плагины инициализируются, но почему пока не могу сказать
avatar
Я бы очень хотел пригласить сюда ort -а может он подскажет почему так возникает
avatar
дело в том, что у движка есть одна проблема с наследованием и она «очень глубоко посажена», когда я однажды с ней столкнулся и обсуждал с Максимом, решили не использовать некоторые методики, которые её вызывают, так она и была забыта и в чем её суть детально я не помню, но точно знаю что наследование в лс может дать сбой.

один из примеров сбоя — сделать константу в наследуемую сущность и получать её из другого участка кода до того момента, как в движке появится первый объект такой сущности. Движок через автозагрузку получит такую сущность, а не через метод GetEntity ядра, который должен создать цепочку наследования и в таком случае в цепочке наследования получается анархия со всеми последствиями.

поэтому такой вопрос: есть ли у вас, например, константы, которые вы получаете из наследуемого объекта, который не был должным образом проинициализирован?
avatar
сложно ответить, могу показать приблизительный (90-95% похожий) но рабочий (в свое время) код github.com/stfalcon/livestreet/blob/master/tests/behat/features/bootstrap/BaseFeatureContext.php#L41
avatar
я привел пример из сущностями не просто так, я этот баг обнаружил когда поменялось немного окружение и сущность не была создана до момента получения из неё константы и код, ранее бывший рабочим, перестал себя так вести и отпустил в полет затаившегося жука.

т.е. хочу сказать что то, что может показаться рабочим, просто пока совпало так (баг на баг).

но
ошибка «циклического наследования».
это как раз очень похоже на то, что я описал. Рекомендую просмотреть все сущности на константы, например, т.к. они первые кто такую ситуацию может создать (все сущности которые создали «кольцо»).
avatar
Тут вопрос даже не в этом а в механизме вызова.
т.к. если работать нормально через веб-сервер то все нормально
т.е. проблема точно в коде инициализации тестов должно быть но пока не вижу где

Если бы проблема была в плагинах то они не работали бы и при заходе через браузер на сервер
avatar
К стати плагины с константами в модулях есть и не одна штука
avatar
в модулях константы — это нормально, а в сущностях — бомба замедленного действия.
avatar
Что предлагаете с ними делать? Заменять константы на значения или есть другой способ?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.