Я добавляю виджет в Typo3Fluid с PHP Неустранимая ошибка: Невозможно объявить класс ...., поскольку имя уже используется в .... в строке 0 - PullRequest
0 голосов
/ 18 марта 2020

Я вижу, что ViewHelperResolver. php фактически загружает FilterViewHelper. php несколько раз. Это может быть ошибкой, но, возможно, я где-то пропускаю что-то, иначе все функции виджетов будут бесполезны в этой изменчивой конфигурации.

PHP Неустранимая ошибка: невозможно объявить класс In2code \ Femanagerextended \ ViewHelper \ Widget \ FilterViewHelper, поскольку имя уже используется в / var / www/typo3v9/typo3conf/ext/femanagerextended/Classes/ViewHelpers/Widget/FilterViewHelper.php в строке 0

из: пространства имен TYPO3Fluid \ Fluid \ Core \ ViewHelper; "ViewHelperResolver. php"

   public function resolveViewHelperClassName($namespaceIdentifier, $methodIdentifier)
    {
        if (!isset($this->resolvedViewHelperClassNames[$namespaceIdentifier][$methodIdentifier])) {
            $resolvedViewHelperClassName = $this->resolveViewHelperName($namespaceIdentifier, $methodIdentifier);  //<-this line load the class with class_exists autoload. see resolveViewHelperName class (following)
            $actualViewHelperClassName = implode('\\', array_map('ucfirst', explode('.', $resolvedViewHelperClassName)));
            if (false === class_exists($actualViewHelperClassName) || $actualViewHelperClassName === false) {  //<-this attemp reload via class_exists autoload.
                throw new ParserException(sprintf(
                    'The ViewHelper "<%s:%s>" could not be resolved.' . chr(10) .
                    'Based on your spelling, the system would load the class "%s", however this class does not exist.',
                    $namespaceIdentifier,
                    $methodIdentifier,
                    $resolvedViewHelperClassName
                ), 1407060572);
            }
            $this->resolvedViewHelperClassNames[$namespaceIdentifier][$methodIdentifier] = $actualViewHelperClassName;
        }
        return $this->resolvedViewHelperClassNames[$namespaceIdentifier][$methodIdentifier];
    }
   protected function resolveViewHelperName($namespaceIdentifier, $methodIdentifier)
    {
        $explodedViewHelperName = explode('.', $methodIdentifier);
        if (count($explodedViewHelperName) > 1) {
            $className = implode('\\', array_map('ucfirst', $explodedViewHelperName));
        } else {
            $className = ucfirst($explodedViewHelperName[0]);
        }
        $className .= 'ViewHelper';

        $namespaces = (array) $this->namespaces[$namespaceIdentifier];

        do {
            $name = rtrim(array_pop($namespaces), '\\') . '\\' . $className;
        } while (!class_exists($name) && count($namespaces)); //<-This load the class via class_exists.

        return $name;
    }
}

Как я вижу, class_exists - это вызов в функции resolViewHelperName, а затем повторный вызов в вызывающей функции resolViewHelperClassName. Второй вызов class_exists не обнаруживает, что класс уже загружен, и пытается загрузить. Значение имени класса - «In2code \ Femanagerextended \ ViewHelpers \ Widget \ FilterViewHelper».

Вызов класса __autoload происходит из пространства имен SJBR \ StaticInfoTables \ Cache \ CachedClassLoader :: autoload, которые не имеют ничего общего с моим расширение. (не актуально)

Хорошо, решите, что это была ошибка опечатки в пространстве имен FilterViewHelper.

...