Laravel 5 找不到自定义命名空间的 class
Laravel 5 can't find class for custom namespace
在我的 Laravel 应用程序中,我将前端和后端代码拆分到文件夹中。它们是 app/Http/Controllers/BackEnd
和 app/Http/Controllers/FrontEnd
。我认为定义两个名称空间 BackEnd
和 FrontEnd
会更容易,而不是在每个文件中键入所有内容。我已将作曲家文件编辑为:
"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。
在我的 Laravel 应用程序中,我将前端和后端代码拆分到文件夹中。它们是 app/Http/Controllers/BackEnd
和 app/Http/Controllers/FrontEnd
。我认为定义两个名称空间 BackEnd
和 FrontEnd
会更容易,而不是在每个文件中键入所有内容。我已将作曲家文件编辑为:
"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。