流明:App\Http\Controllers\Controller class 全新安装未找到

lumen: App\Http\Controllers\Controller class not found with fresh install

我正在使用 全新安装 Lumen(构建网络 API),大部分工作正常,但当我尝试使用路由器来指向 class 我收到此错误:

Fatal error: Class 'App\Http\Controllers\Controller' not found in /Applications/MAMP/htdocs/moments/lumen/app/Http/Controllers/MomentController.php on line 5

这是我在 app/Http/routes 中的 路由器 。php

$app->get('/', 'MomentController@index');

这是我在 app/Http/Controllers/MomentControllerclass。php

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class MomentController extends Controller {

    public function index()
    {
        echo 123;
    }

}

我已经在 bootstrap/app 中激活了这些组件。php:

这是我的composer.json文件:

{
    "name": "laravel/lumen",
    "description": "The Laravel Lumen Framework.",
    "keywords": ["framework", "laravel", "lumen"],
    "license": "MIT",
    "type": "project",
    "require": {
        "laravel/lumen-framework": "5.1.*",
        "vlucas/phpdotenv": "~1.0"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "fzaninotto/faker": "~1.0"
    },
    "autoload": {
        "psr-4": {
            "App\": "app/"
        },
        "classmap": [
            "database/"
        ]
    },
    "autoload-dev": {
        "classmap": [
            "tests/"
        ]
    },
    "config": {
        "preferred-install": "dist"
    }
}

我认为这与命名空间有关,但我想不通。有什么线索吗?

谢谢,

删除 use App\Http\Controllers\Controller;,因为不需要那个。

然后检查您的 composer.json 是否为 app 目录启用了 psr-4。

此外,尝试在命令行上使用 composer du 来转储并重新生成自动加载文件。

试试这个

$app->get('/', 'App\Http\Controllers\MomentController@index');

或(更好)将它们分组

$app->group(['namespace' => 'App\Http\Controllers'], function($group){

    $group->get('/', 'MomentController@index');
    $group->get('foo', 'MomentController@otherAction');

});

并删除 use App\Http\Controllers\Controller; 如@lowerends

解决方案是 link 到正确的基本控制器,以便它可以扩展那个 class。

use Laravel\Lumen\Routing\Controller as BaseController;

这一行是我唯一必须添加的内容才能使其正常工作。

所以完整的class变成了这样:

<?php namespace App\Http\Controllers;

use Laravel\Lumen\Routing\Controller as BaseController;

class ChannelController extends BaseController {

    public function getChannels(){}
    public function getChannel(){}

}

我想您已经使用 lumen new 而不是 composer create-project laravel/lumen --prefer-dist 创建了一个项目。您可以尝试使用 composer 创建一个新的 lumen 项目并尝试重现此问题。

唉,none 这些可靠的工作。我不能把解决方案归功于我,但如果你来这里寻找有效的答案,请投票给这个。 Lukas Geiter 的原创 post:

我确实更改了 foo/bar 示例,因为真的,谁真正喜欢它?


您必须使用完全限定的类名:

$app->get('/', 'App\Http\Controllers\HomeController@index');

将所有路由包装在一个组中(这实际上是 Laravel 5 中的幕后操作)

$app->group(['namespace' => 'App\Http\Controllers'], function($group){

    $group->get('/', 'HomeController@index');
    $group->get('users', 'UserController@index');

});

对于最终来到这里遇到同样问题的任何其他人。我在新安装的 Lumen 5.2 中删除路由时遇到了同样的问题。

在网上搜索了几个小时后,发现 Lumen 使用的路由控制器与 Laravel 使用的不同。 Lumen 使用 nikic fastroute。

Lumen 路由控制器不支持路由组前缀,即使它列在 Lumen 的文档中。我不知道这是否是原始发布者的问题,因为完整的路线详细信息不可用,但希望它能为其他人节省几个小时。

如果这是一个需要手动 enabled/added 的功能(如果 Lumen 现在支持它,如文档所建议的那样),我无法找到任何参考。也许有人可以阐明这一点?

https://lumen.laravel.com/docs/5.2/routing#route-group-prefixes