首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5找不到自定义命名空间的类

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

Stack Overflow用户
提问于 2015-06-29 09:44:21
回答 3查看 3.3K关注 0票数 3

在我的Laravel应用程序中,我将前端和后端代码分成文件夹。这些是app/Http/Controllers/BackEndapp/Http/Controllers/FrontEnd。与其在每个文件上键入所有这些内容,我认为定义两个名称空间( BackEndFrontEnd )会更容易。我编辑了我的作曲家文件如下:

代码语言:javascript
复制
"autoload": {
    "classmap": [
        "app/Models",
        "database"
    ],
    "psr-4": {
        "App\\": "app/",
        "BackEnd\\": "app/Http/Controllers/BackEnd",
        "FrontEnd\\": "app/Http/Controllers/FrontEnd"
    }
},

然后运行composer自动转储并设置如下的路由文件:

代码语言:javascript
复制
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。控制器确实存在,这是一个文件:

代码语言:javascript
复制
<?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,那么一切都正常,为什么?我遗漏了什么?为什么autoload找不到只有BackEnd的文件

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-29 10:09:38

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

代码语言:javascript
复制
Route::group(['prefix' => 'webman', 'middleware' => 'auth'], function()
{
    Route::get('/', ['as' => 'webmanHome', 'uses' => '\BackEnd\HomeController@index']); 
});
票数 5
EN

Stack Overflow用户

发布于 2015-06-29 10:17:52

尝试在RouteServiceProvider.php protected $namespace = 'App\Http\Controllers';中更改/注释下面一行

票数 0
EN

Stack Overflow用户

发布于 2017-02-12 19:13:39

有个有趣而简单的方法可以绕过这一切..。服务提供者。

当通过提供程序加载路由文件时,“App\Http.”没有被强制执行。

代码语言:javascript
复制
public function boot()
{
    $this->loadRoutesFrom(app_path('Your/Model/routes.php'));
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31112491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档