Laravel / Symfony: невозможно загрузить файл конфигурации "app" - PullRequest
9 голосов
/ 02 июля 2019

После обновления моей Homestead и установки пакетов я наткнулся на странную ошибку. При вызове php artisan в качестве вывода было указано следующее:

In LoadConfiguration.php line 68:

Unable to load the "app" configuration file.

Несколько человек предполагают , что это является причиной того, что Windows (10) использует заглавные буквы в именах файлов. Однако это не видно в моих папках, а также не применяется в моей среде Ubuntu (18.04).

Из исходного кода LoadConfiguration.php видно, что он использует класс Finder из компонента symfony/finder.

foreach (Finder::create()->files()->name('*.php')->in($configPath) as $file) {
    $directory = $this->getNestedDirectory($file, $configPath);

    $files[$directory.basename($file->getRealPath(), '.php')] = $file->getRealPath();
}

Проблема в том, что искатель возвращает итератор, который каким-то образом не может найти мои файлы конфигурации. Простой scandir($configPath) возвращает все файлы:

.
..
app.php
and all other files

Заключение вызова в iterator_to_array() возвращает пустой массив [].

Следующий объект возвращается путем добавления ..->in($configPath)->getIterator():

Symfony\Component\Finder\Iterator\PathFilterIterator {#47
  #matchRegexps: []
  #noMatchRegexps: array:2 [
    0 => "#(^|/)\..+(/|$)#"
    1 => "#(^|/)\..+(/|$)#"
  ]
  innerIterator: Symfony\Component\Finder\Iterator\FilenameFilterIterator {#43
    #matchRegexps: array:1 [
      0 => "#^(?=[^\.])[^/]*\.php$#"
    ]
    #noMatchRegexps: []
    innerIterator: Symfony\Component\Finder\Iterator\FileTypeFilterIterator {#39
      -mode: 1
      innerIterator: RecursiveIteratorIterator {#42
        innerIterator: Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator {#46
          -iterator: Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator {#48
            -ignoreUnreadableDirs: false
            -rewindable: null
            -rootPath: "/home/vagrant/somepath/api/config"
            -subPath: null
            -directorySeparator: "/"
            path: "/home/vagrant/somepath/api/config"
            filename: "app.php"
            basename: "app.php"
            pathname: "/home/vagrant/somepath/api/config/app.php"
            extension: "php"
            realPath: "./config/app.php"
            aTime: 2019-07-02 09:28:30
            mTime: 2019-01-31 17:43:49
            cTime: 2019-07-02 16:32:52
            inode: 429
            size: 9727
            perms: 0100777
            owner: 1000
            group: 1000
            type: "file"
            writable: true
            readable: true
            executable: true
            file: true
            dir: false
            link: false
          }
          -isRecursive: true
          -excludedDirs: array:9 [
            ".svn" => true
            "_svn" => true
            "CVS" => true
            "_darcs" => true
            ".arch-params" => true
            ".monotone" => true
            ".bzr" => true
            ".git" => true
            ".hg" => true
          ]
          -excludedPattern: null
          innerIterator: Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator {#48}
        }
      }
    }
  }
}

Предположим, я ничего не знаю об итераторах такого типа. Мне выделяются две вещи:

  • Присутствует много innerIterator.
  • Один итератор может найти что-то #48, мы можем видеть наш config/app.php, но внутри ExcludeDirectoryFilterIterator.

Кто-нибудь имел эту проблему раньше или знает, как вести меня в правильном направлении?

Были использованы следующие версии:

OS: Windows 10/Ubuntu 18.04 LTS
Homestead: 9.0.1
laravel/framework: 5.8.*/5.7.*
 \ symfony/finder: ^4.2/^4.1,

EDIT

Понизил мою Усадьбу до v8.0.1 и все работает. Однако до сих пор нет объяснения, почему это произошло v9.0.1.

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Попробуйте обновить VirtualBox до v6. См. эту проблему GitHub для получения дополнительной помощи.

0 голосов
/ 05 июля 2019

У меня нет ответа на вопрос, почему это произошло, но я разработал код, альтернативный использованию Finder в функции LoadConfiguration::getConfigurationFiles (в пределах \ vendor \ laravel \ framework \ src \ Осветите \ Foundation \ Bootstrap \ LoadConfiguration.php), что позволяет без проблем запускать команды php artisan ...

protected function getConfigurationFiles(Application $app)
{
    $files = [];

    $configPath = realpath($app->configPath());

    $file = new \DirectoryIterator($configPath);
    while($file->valid()) {
        if(!$file->isDot() && ($file->getExtension() == 'php')) {
            $directory = $this->getNestedDirectory($file, $configPath);
            $files[$directory.basename($file->getRealPath(), '.php')] = $file->getRealPath();
        }
        $file->next();
    }

    ksort($files, SORT_NATURAL);

    return $files;
}

Надеюсь, это кому-нибудь поможет.

...