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.

的静态函数

我认为它失败有两个原因:

  1. 使用 public_path() 确保您使用正确的路径访问 public 目录
  2. 你在你的方法中调用了dirToArray,而你的方法是directoryToArray。如果此函数是递归的,则两者应具有相同的名称(并使用 self:: 作为前缀)