Скандир PHP не работает в Laravel

Поэтому я пытаюсь передать каталог функции модели в моем приложении Laravel, которое использует PHP scandirи он не может найти каталог. Строка / путь, к которому я добавляю scandir является /staffportal/public/public/documents/ra_docs/, Каталог, который я в конечном итоге пытаюсь скормить scandir является ra_docs. Вот структура каталогов (> означает каталог):

 >staffportal
>public
>documents
>ra_docs
>app
>bootstrap
>vendor

И только ради тщательности, вот функция, которую я выполняю.

public static function directoryToArray($directory)
{
$result = array();

$currentDirectory = scandir($directory);
foreach ($currentDirectory as $key => $value)
{
if(!in_array($value, array(".","..")))
{
if (is_dir($directory . DIRECTORY_SEPARATOR . $value))
{
$result[$value] = dirToArray($directory . DIRECTORY_SEPARATOR . $value);
}
else
{
$result[] = $value;
}
}
}

return $result;
}

Есть идеи?

3

Решение

Если я немного изменю твой код, меняю public static function directoryToArray в function dirToArray, чтобы соответствовать вызову dirToArray внутри функции она работает так, как я и ожидал.

Проблема заключается либо в том несоответствии, либо в том, что вы ему передаете. Я начну с последнего.

Для начала, как указано в комментарии The Shift Exchange, вы передаете public/public как часть вашей строки, и структура каталогов, которую вы показываете в своем вопросе, не имеет такого пути.

Во-вторых, вы проходите абсолютный путь. PHP пытается открыть каталог staffportal в корневом каталоге /, так как вы начали строку с /, Но предположительно staffportal каталог не находится непосредственно в корне вашей файловой системы.

Из вашей структуры каталогов может показаться, что staffportal является корнем вашего приложения Laravel. Вы можете получить путь к этому через встроенный в Laravel base_path вспомогательная функция (см. документы Laravel). Или, так как каталог, который вы ищете, находится внутри public, вы можете использовать функцию, которая дает вам путь прямо туда, public_path (из тех же документов).

Попробуйте пройти по пути так:

dirToArray(public_path() . '/documents/ra_docs')

(Вы могли бы использовать DIRECTORY_SEPARATOR вместо косых черт, если у вас есть проблемы с переносимостью и вы хотите соответствовать стилю вашей функции.)

Я полагаю, однако, что вы хотели, чтобы эта функция была статической функцией в вашей модели. Так что, если вы на самом деле правильно проходили путь, и вышеописанное не помогло, возможно, ошибка в вашей функции, когда вы пытаетесь выполнить рекурсию с вызовом dirToArray — это должно быть self::directoryToArray так как вы объявили это как статическую функцию класса.

2

Другие решения

Я думаю, что это не удается по 2 причинам:

  1. используйте public_path (), чтобы убедиться, что вы обращаетесь к общедоступному каталогу с правильным путем
  2. ты звонишь dirToArray в вашем методе, в то время как ваш метод directoryToArray. Если эта функция предназначена для рекурсии, вы должны иметь одинаковое имя для обоих (и использовать self:: в качестве префикса)
0

По вопросам рекламы [email protected]