cakephp - scandir 无法打开目录错误

cakephp - scandir failed to open dir error

我正在尝试获取控制器文件列表

$files = scandir(APP_DIR . '/Controller/');

...但我收到此错误:

Warning (2): scandir(src/Controller/): failed to open dir: No such file or directory [APP/Controller/HomeController.php, line 13]

...当我尝试从列表中删除一些文件名时: $files = array_diff( $files, array('.','..','Component','AppController.php','HomeController.php'));

...我收到此错误:

Warning (2): array_diff() [function.array-diff]: Argument #1 is not an array [APP/Controller/HomeController.php, line 23]

我的整个 class 看起来是这样的:

<?php
namespace App\Controller;
use ReflectionClass;
use ReflectionMethod;

class HomeController extends AppController{
    public function index(){

        /**
         * 
         * 
         */

        $files = scandir(APP_DIR . '/Controller/');
        $controllers = [];
        $ignoreFilesList = [
            '.',
            '..',
            'Component',
            'AppController.php',
            'HomeController.php'
        ];

        $files = array_diff( $files, array('.','..','Component','AppController.php','HomeController.php'));
        $className = '';
        $class = null;
        $ignoreList2 = ['beforeFilter', 'afterFilter', 'initialize', 'delete'];


        echo is_array ( (array)$files );// returns 0 without cast

        foreach( (array)$files as $file){

                $controller = str_replace('Controller', '', explode('.', $file)[0]);
                array_push($controllers, $controller); //str_replace('Controller', '', $controller));

                //dump( $controller );

                /* controller methods */
                $this->$className = 'App\Controller\'.$controller.'Controller';
                $this->$class = new ReflectionClass($this->$className);
                $methods = $this->$class->getMethods(ReflectionMethod::IS_PUBLIC);

                echo "<ul><li>$controller</li>";
                echo "<ol>";

                foreach($methods as $method){

                    if ( isset( $method->name )){

                        if($method->class == $className && !in_array($method->name, $ignoreList2))
                        {
                            $controllers[$controller][]= $method->name;
                            echo "<li>$method->name</li>";
                        }
                    }
                }
                echo "</ol>";
                echo "</ul>";

        }

        $this->set('allControllers', $controllers );
    }
}

仅使用带有完整路径的 PHP: scandir

虽然 PHP 文档对此只字不提,但 scandir 通常不能很好地处理相对路径。 (尽管在某些情况下相对路径可以很好地工作。)

这里的路径arg是相对路径

由于 APP_DIR 存储单个目录名称,而不是路径,scandir 将尝试访问 src/Controller/,这可能与当前 运行.[=23 的脚本无关=]

$files = scandir(APP_DIR . '/Controller/');

解决方案 1:使用 CakePhp: constant APP 构建完整路径

感谢 ndm 在他对 OP 的评论中提醒我们 APP 常量。 APP 存储应用程序目录的绝对路径,包括尾部斜杠。

$path = APP .'Controller/';
$files = scandir($path);

解决方案 2:使用 PHP: $_SERVER['DOCUMENT_ROOT'] 构建完整路径。

$path = $_SERVER['DOCUMENT_ROOT'] . '/'. APP_DIR .'/Controller/';
$files = scandir($path);

或者,您可以能够使用PHP: Realpath检索完整路径。 *提醒:工作目录会因脚本而异运行.