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

时间:2015-06-29 09:44:21

标签: php laravel namespaces laravel-5 autoload

在我的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'),中。

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

3 个答案:

答案 0 :(得分:3)

namespace中设置Route::group()时,实际上会将其附加到App\Http\Controllers。您可以做的是删除它并引用完整路径,如下所示:

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

答案 1 :(得分:0)

尝试更改/评论RouteServiceProvider.php中的以下行 <select ng-model="book.titleId" ng-options="title.id as title.text for title in titles"> <option value="" disabled selected style="display: none;">Select book</option> </select>

答案 2 :(得分:0)

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

当通过提供商加载路线文件时,&#39; App \ Http ...&#39;没有强制执行。

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

请记住,也没有附加中间件。您的路线组必须指定一个&#39;网络&#39;中间件或者你会疯狂地想知道为什么验证等等不再适用了......(去过那里!)

无论如何,这是一种很酷的方式,使用提供商可以获得更多的模块化代码并重复使用。