升级到稳定版后,CakePHP3 MissingControllerException

时间:2015-03-23 13:53:13

标签: php cakephp cakephp-3.0

今天早上我读到CakePHP 3已经发布。我跑了一个composer update并受到MissingControllerException的欢迎。我很确定除了通过composer进行更新之外我什么都没做(我想添加BootstrapUI插件,但之后还原了所有的更改)。该错误消息告诉我创建一个已存在的文件(src\Controller\IndexController.php)。

我没有更改路由,但也尝试使用骨架应用程序中的routes.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
}

1 个答案:

答案 0 :(得分:0)

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

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

解决方案是改变composer.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"
    }
},