CakePHP3 Missing Controller升级到稳定版后异常


CakePHP3 MissingControllerException after upgrade to stable version

今天早上我读到CakePHP 3已经发布。我跑了一composer update,迎接我的是MissingControllerException.我很确定除了通过作曲家更新之外,我什么也没做(我想添加 BootstrapUI 插件,但后来恢复了所有更改(。错误消息告诉我创建一个已经存在的文件(src'Controller'IndexController.php(。

我没有更改路由,但也尝试使用路由.php来自骨架应用程序(去除了注释,仅使用默认路径/这应该导致索引控制器的索引操作(:

Router::defaultRouteClass('Route');
Router::scope('/', function ($routes) {
    $routes->connect('/', ['controller' => 'Index', 'action' => 'display', 'home']);
    $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
    $routes->fallbacks('InflectedRoute');
});
Plugin::routes(); 

我还检查了作曲家的自动加载。它似乎与骨架应用程序中的相同。在这一点上,我不知道还有什么要寻找的,或者我可以为您提供哪些其他数据。也许 composer.json 会有所帮助:

{
    "name": "xyz/appname",
    "description": "",
    "type": "project",
    "keywords": [""],
    "license": "GPL-3.0",
    "authors": [
        {
            "name": "xyz"
        }
    ],
    "require": {
        "php": ">=5.4.16",
        "cakephp/cakephp": "~3.0",
        "mobiledetect/mobiledetectlib": "2.*",
        "cakephp/migrations": "~1.0",
        "cakephp/plugin-installer": "*"
    },
    "require-dev": {
        "phpunit/phpunit": "4.*",
        "cakephp/debug_kit": "~3.0",
        "cakephp/bake": "~1.0"
    },
    "config": {
        "vendor-dir": "vendor/"
    },
    "autoload": {
        "psr-4": {
            "appname''": "src"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "appname''Test''": "tests",
            "Cake''Test''": "./vendor/cakephp/cakephp/tests"
        }
    },
    "scripts": {
        "post-install-cmd": "App''Console''Installer::postInstall",
        "post-autoload-dump": "Cake''Composer''Installer''PluginInstaller::postAutoloadDump"
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

我已经解决了 D'OH。我检查了作曲家的autoload_psr4.php并发现了错误。我的应用程序名为4Hoarders。但是命名空间和类名不允许以数字开头。所以我将命名空间更改为 Hoarders .composer.json具有全名 4Hoarders,因此生成了如下所示的类加载:

...
'4Hoarders''Test''' => array($baseDir . '/tests'),
'4Hoarders''' => array($baseDir . '/src'),
...

解决方案是从这里更改作曲家.json:

"autoload": {
    "psr-4": {
        "4Hoarders''": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "4Hoarders''Test''": "tests",
        "Cake''Test''": "./vendor/cakephp/cakephp/tests"
    }
},

对此:

"autoload": {
    "psr-4": {
        "Hoarders''": "src"
    }
},
"autoload-dev": {
    "psr-4": {
        "Hoarders''Test''": "tests",
        "Cake''Test''": "./vendor/cakephp/cakephp/tests"
    }
},