【问题标题】:Laravel 5 can't find class for custom namespaceLaravel 5 找不到自定义命名空间的类
【发布时间】:2015-09-15 17:28:32
【问题描述】:

在我的 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\\' =&gt; array($baseDir . '/app/Http/Controllers/BackEnd'), 中。

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

【问题讨论】:

  • 可能您的刀片模板尝试访问错误位置的控制器。 (如果您使用的是“动作”,请参考)因此请在刀片中指定控制器,例如 BackEnd\HomeController@lala

标签: php laravel namespaces laravel-5 autoload


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这解决了我的问题。你能解释一下为什么使用'namespace' =&gt; '\BackEnd' 也不起作用吗?
  • namespace 的值被删除斜线,然后附加到 App\Http\Controllers。查看源代码,特别是vendor/laravel/framework/src/Illuminate/Routing/Router.php 中的formatUsesPrefix() 方法。
【解决方案2】:

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

【讨论】:

  • 包含有关此功能的作用以及可能如何破坏其他路线的信息可能是个好主意。
【解决方案3】:

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

当通过提供者加载路由文件时,'App\Http...' 不会被强制执行。

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

请记住,也没有附加中间件。你的路由组必须指定一个“网络”中间件,否则你会发疯地想知道为什么验证等不再起作用......(去过那里!)

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

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2015-04-13
    • 1970-01-01
    • 2015-02-02
    • 2016-07-06
    • 2015-09-23
    • 2015-03-06
    • 1970-01-01
    相关资源
    最近更新 更多