自动加载器冲突,无法打开流

autoloader conflicts, fail to open stream

我在我的控制器文件中编写了自动加载程序来加载 class 文件。这很好地加载了服务文件夹中的 class。但是当加载 class 不在服务文件夹中时会导致此问题。

[2017-05-11 17:38:23] production.ERROR: exception 'ErrorException' with message 'include(/var/www/market/app/services/ProductDomain.php): failed to open stream: No such file or directory' in /var/www/market/app/controllers/CloudController.php:27

public function __construct()
{
    spl_autoload_register(function($classname) {
        include app_path() . '/services/' . $classname . '.php';
    });
}

这可能是与其他自动加载器冲突造成的,可能是laravel的自动加载器。我想知道如何让我的自动加载器只加载服务文件夹下的 class 文件,其余 class 文件由 laravel 框架的自动加载器加载。

如何解决这个问题。提前谢谢你。

如果文件实际存在,并且您有正确的权限(您可以执行 chmod 777 进行测试)尝试 composer install,然后是 composer dump-autoload -o

我通过先检查文件是否存在来解决这个问题。并且自动加载器有加载顺序。

manual,

If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined. By contrast, __autoload() may only be defined once.

public function __construct()
{
    spl_autoload_register(function($classname) {
        if(file_exists(app_path() . '/services/' . $classname . '.php'))
            include app_path() . '/services/' . $classname . '.php';
    });
}

所以我定义的自动加载器将在 laravel 框架的自动加载器之前加载 php class。