Laravel 5 找不到自定义命名空间的 class

Laravel 5 can't find class for custom namespace

在我的 Laravel 应用程序中,我将前端和后端代码拆分到文件夹中。它们是 app/Http/Controllers/BackEndapp/Http/Controllers/FrontEnd。我认为定义两个名称空间 BackEndFrontEnd 会更容易,而不是在每个文件中键入所有内容。我已将作曲家文件编辑为:

"autoload": {
    "classmap": [
        "app/Models",
        "database"
    ],
    "psr-4": {
        "App\": "app/",
        "BackEnd\": "app/Http/Controllers/BackEnd",
        "FrontEnd\": "app/Http/Controllers/FrontEnd"
    }
},

然后我 运行 composer autodump 并像这样设置我的路由文件:

Route::group(['prefix' => 'webman', 'middleware' => 'auth', 'namespace' => 'BackEnd'], function()
{
   Route::get('/', ['as' => 'webmanHome', 'uses' => 'HomeController@index']); 
});

但是当我浏览到 localhost:8000/webman/ 时,我收到一个错误,Class App\Http\Controllers\BackEnd\HomeController does not exist。控制器确实存在,这是文件:

<?php namespace BackEnd;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class HomeController extends Controller {

    /**
     * Display the admin home page, showing the front-end menu and "apps" as links to other sections of the ACP.
     *
     * @param Reqeust       $request
     *
     * @return View
     */
    public function index(Request $request)
    {
        return view('backend.index');
    }

}

我检查了 vendor/composer/autoload_psr4.php 以确保正在定义命名空间,它在返回的数组中 'BackEnd\' => array($baseDir . '/app/Http/Controllers/BackEnd'),

St运行gely 如果我在 HomeController.php 的顶部使用 <?php namespace App\Http\Controllers\BackEnd; 那么一切正常,为什么?我错过了什么?为什么仅 BackEnd 无法自动加载找到文件?

Route::group() 中设置 namespace 时,它实际上是将其附加到 App\Http\Controllers。你可以做的是删除它并像这样引用完整路径:

Route::group(['prefix' => 'webman', 'middleware' => 'auth'], function()
{
    Route::get('/', ['as' => 'webmanHome', 'uses' => '\BackEnd\HomeController@index']); 
});

尝试 changing/commenting RouteServiceProvider.php 中的下面一行 protected $namespace = 'App\Http\Controllers';

有一种有趣且简单的方法可以解决这个问题...服务提供商。

当通过提供商加载路由文件时,'App\Http...' 未强制执行。

public function boot()
{
    $this->loadRoutesFrom(app_path('Your/Model/routes.php'));
}

请记住,也没有附加任何中间件。您的路由组将必须指定一个 'web' 中间件,否则您会发疯想知道为什么验证等不再工作....(在那里!)

无论如何,这是一种很酷的方式,使用提供程序会导致更多的模块化代码和 re-use。