PHP scandir 在 Laravel 中失败
PHP scandir failing in Laravel
所以我试图将目录传递给我的 Laravel 应用程序中的模型函数,该应用程序使用 PHP 的 scandir
,但它似乎无法找到目录。我提供给 scandir
的 string/path 是 /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
辅助函数(参见 the Laravel docs)获得路径。或者,由于您要查找的目录在 public
内,您可以使用直接为您提供路径的函数,public_path
(来自相同的文档)。
尝试像这样传递路径:
dirToArray(public_path() . '/documents/ra_docs')
(如果您担心可移植性并希望匹配函数的样式,可以使用 DIRECTORY_SEPARATOR
代替斜杠。)
不过,我想您确实打算将该函数作为模型上的静态函数。因此,如果您实际上正确地传递了路径并且上述方法没有帮助,则错误可能出在您尝试通过调用 dirToArray
进行递归的函数中 - 这应该是 self::directoryToArray
因为您已将其声明为 class.
的静态函数
我认为它失败有两个原因:
- 使用 public_path() 确保您使用正确的路径访问 public 目录
- 你在你的方法中调用了
dirToArray
,而你的方法是directoryToArray
。如果此函数是递归的,则两者应具有相同的名称(并使用 self::
作为前缀)
所以我试图将目录传递给我的 Laravel 应用程序中的模型函数,该应用程序使用 PHP 的 scandir
,但它似乎无法找到目录。我提供给 scandir
的 string/path 是 /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
辅助函数(参见 the Laravel docs)获得路径。或者,由于您要查找的目录在 public
内,您可以使用直接为您提供路径的函数,public_path
(来自相同的文档)。
尝试像这样传递路径:
dirToArray(public_path() . '/documents/ra_docs')
(如果您担心可移植性并希望匹配函数的样式,可以使用 DIRECTORY_SEPARATOR
代替斜杠。)
不过,我想您确实打算将该函数作为模型上的静态函数。因此,如果您实际上正确地传递了路径并且上述方法没有帮助,则错误可能出在您尝试通过调用 dirToArray
进行递归的函数中 - 这应该是 self::directoryToArray
因为您已将其声明为 class.
我认为它失败有两个原因:
- 使用 public_path() 确保您使用正确的路径访问 public 目录
- 你在你的方法中调用了
dirToArray
,而你的方法是directoryToArray
。如果此函数是递归的,则两者应具有相同的名称(并使用self::
作为前缀)