我有一个simple package,我想使用控制器。当我尝试在我得到的路线中使用它时
Class App\Http\Controllers\Tropicalista\Admin\Controllers\DashboardController
does not exist
我在/routes/web.php中有这个
Route::group([
'namespace' => '\Tropicalista\Admin\Controllers',
'prefix'=> 'admin'], function() {
Route::get('/', ['as' => 'admin.root', 'uses' => 'DashboardController@index']);
});
我的控制器:
namespace Tropicalista\Admin\Controllers;
use Illuminate\Http\Request;
use Analytics;
use Carbon\Carbon;
use Spatie\Analytics\Period;
use Illuminate\Support\Collection;
use Illuminate\Routing\Controller;
class DashboardController extends Controller
{...}
我认为是命名空间问题。那么如何调用包控制器呢?
默认情况下,
RouteServiceProvider
包含namespace
组中的路由文件,允许您注册控制器路由,而无需指定完整的App\Http\Controllers
名称空间前缀。所以,你only
需要指定comes after
基础App\Http\Controllers
命名空间的命名空间部分。
你需要删除namespace
Route::group(['prefix'=> 'admin'], function() {
Route::get('/', ['as' => 'admin.root', 'uses' => '\Tropicalista\Admin\Controllers\DashboardController@index']);
});
因为它是一个包,你需要在包中加入register the routes。
您可以看到注册包控制器here的示例:
$routeConfig = [
'namespace' => 'Barryvdh\Debugbar\Controllers',
'prefix' => $this->app['config']->get('debugbar.route_prefix'),
'domain' => $this->app['config']->get('debugbar.route_domain'),
'middleware' => [DebugbarEnabled::class],
];
$this->getRouter()->group($routeConfig, function($router) {
$router->get('open', [
'uses' => 'OpenHandlerController@handle',
'as' => 'debugbar.openhandler',
]);
});
要调用包控制器,请从中更改RouteServiceProvider的命名空间组
protected $namespace = 'App\Http\Controllers';
为空/空即
protected $namespace = '';
然后,路线可以写成,
Route::get('homepage', 'Package\Namespace\Controllers\ControllerName@ActionName');
此外,如果要为默认控制器编写路由,请在启动url之前使用前导斜杠“/”。
Route::get('/homepage', 'App\Http\Controllers\ControllerName@ActionName');
是否良好的做法,但它解决了问题。