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检索完整路径。 *提醒:工作目录会因脚本而异运行.
我正在尝试获取控制器文件列表
$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检索完整路径。 *提醒:工作目录会因脚本而异运行.