Magento 2 - класс не существует на установке: di: compile - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть некоторые проблемы с Magento 2. Я сделал свой собственный модуль, он выглядит нормально, но когда я установил свой модуль и сделал php bin/magento setup:di:compile, появляется эта ошибка:

[ReflectionException] Класс \ MyInstaller не существует

брошено setup/src/Magento/Setup/Module/PhpScanner.php

Класс MyInstaller существует, однако я изменил путь к файлу класса. Первоначально был путь /my-libraries/MyInstaller.php, но когда я тестировал его локально, у меня была ошибка, как указано выше:

[ReflectionException] Класс \ MyInstaller не существует

Когда я изменил имя папки на mylibraries, на localhost все работает нормально. Однако, когда я устанавливаю модуль на внешний сервер, у меня ReflectionException. Не отображается, когда я меняю имя папки на исходное - «my-library». Как я заметил, Magento все еще призывает к старому пути. Тем не менее, я попытался запустить новый экземпляр Magento 2, и я все еще получаю эту ошибку.

Я пытался очистить кеш:

bin/magento cache:clean
bin/magento cache:flush

Я тоже пытался удалить папку /var. После включения моего модуля я делаю:

php bin/magento setup:upgrade

и

php bin/magento setup:static-content:deploy

Не могли бы вы сказать мне, как я могу заставить Magento использовать новый путь к файлу? Или я должен изменить некоторые настройки кэша на моем сервере?

Добавляю, в классе MyInstaller нет пространства имен, потому что я использую тот же файл в других модулях. Но, я думаю, они не нужны, если на локальном хосте нет ошибки.

Существует код класса MyInstaller:

<?php

if (!class_exists('MyInstaller', false)) {
class MyInstaller implements MyInterface
{
    private $translations;
    private $sliderEnabled = true;
    private $pages = array();

    public function __construct($sliderEnabled = true, array $translations = array())
    {
        $this->sliderEnabled = $sliderEnabled;
        $this->setTranslations($translations);
    }

    public function setTranslations(array $translations = array())
    {
        $this->translations = $translations;

    }

    public function addPages(array $pages = array())
    {
        $this->pages = array_values($pages);
    }

    public function renderInstallerSteps()
    {
        if (!$this->sliderEnabled || empty($this->pages) || !is_array($this->pages)) {
            return '';
        }

        $requirements = $this->checkRequirements();
        $params = array(
            'requirements' => $requirements,
            'translations' => $this->translations
        );
        $maxSteps = 0;
        $data = array(
            'steps' => array()
        );
        foreach ($this->pages as $page) {
            $page = (int)$page;
            if ($page > 0) {
                $step = $this->loadStep($page, $params);
                $data['steps'][$page] = $step;
                $maxSteps++;
            }
        }

        if ($maxSteps === 0) {
            return '';
        }
        $data['maxSteps'] = $maxSteps;

        return $this->loadTemplate('installer', $data);
    }

    private function loadStep($number, $params = null)
    {
        $step = $this->loadTemplate('step' . $number, $params);
        $step = $this->removeNewLines($step);
        return $step;
    }

    private function removeNewLines($string)
    {
        return trim(str_replace(PHP_EOL, ' ', $string));
    }

    private function loadTemplate($view, $data = null)
    {
        extract(array("content" => $data));
        ob_start();
        $viewFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'theme' . DIRECTORY_SEPARATOR . "$view.tpl.php";

        if (file_exists($viewFile)) {
            include $viewFile;
        } else {
            throw new Exception('View not exist in ' . get_class($this));
        }
        $content = ob_get_clean();
        return $content;
    }

    private function checkRequirements()
    {
        $data = array(
            'php' => array(
                'test' => (version_compare(PHP_VERSION, '5.2.0') > 0),
                'label' => $this->translations['php_version']
            ),
            'curl' => array(
                'test' => function_exists('curl_version'),
                'label' => $this->translations['curl_enabled']
            ),
            'soap' => array(
                'test' => class_exists('SoapClient'),
                'label' => $this->translations['soap_enabled']
            )
        );
        return $data;
    }
}

}

Извините, если описание хаотично, это мой первый пост здесь.

1 Ответ

0 голосов
/ 30 апреля 2018

Magento2 зависит от пространств имен для разделения и определения местоположения модулей и классов.

ВСЕ ФАЙЛЫ НУЖДАЮТСЯ В ЗАЯВЛЕННОМ ИМЕННОМ ПРОСТРАНСТВЕ:

<?php
    namespace Vendor\MyModule\Setup;

    class MyInstaller implements ... {}

РЕДАКТИРОВАТЬ - ПОСЛЕ СМ. КОММЕНТАРИИ

Также проверьте чувствительность к регистру - системы UNIX рассматривают Это и это как два отдельных файла, тогда как Windows увидит это как один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...