Поэтому я пытаюсь передать каталог функции модели в моем приложении 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;
}
Есть идеи?
Если я немного изменю твой код, меняю 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 причинам:
dirToArray
в вашем методе, в то время как ваш метод directoryToArray
. Если эта функция предназначена для рекурсии, вы должны иметь одинаковое имя для обоих (и использовать self::
в качестве префикса)