在 laravel 5 中的子文件夹下创建控制器的正确方法
Proper way to create controllers under a subfolder in laravel 5
我已经为这个问题苦苦挣扎了一个小时,我不确定我做错了什么。所以情况是这样的。我想创建一个控制器文件夹,将不同的控制器分组到他们的组中。默认情况下,laravel 个项目创建了这样的控制器文件夹结构
Http
--Controller
----Auth
所以我想做的就是做这样的东西
Http
--Controller
----Auth
----Folder_a
----Folder_b
----Folder_c
创建我的文件夹后,我文件夹中的控制器也像这样正确地命名空间
<?php namespace App\Http\Controllers\Folder_a;
/*
|--------------------------------------------------------------------------
| Use the main controller to allow extend to the main controller
|--------------------------------------------------------------------------
*/
use App\Http\Controllers\Controller;
class SomethingController extends Controller {
/* Do something here*/
}
最后在我的 routes.php 中,我称这样的动作为
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
但是当我尝试导航到该站点时,它给了我这个错误
ReflectionException in compiled.php line 1029:
Class App\Http\Controllers\SomethingController does not exist
注意到它仍然进入默认文件夹 App\Http\Controllers\ 以找到控制器,但如果我这样做的话
Route::get('/action1/', array('as' => 'action1', 'uses' => 'Folder_a\SomethingController@action1'));
那一切都会好起来的...这种情况下我做错了什么?我也试过 composer dump-autoload,没有任何改变。
你没有做错任何事。这是预期的行为! Laravel默认会搜索相对于App\Http\Controllers
的指定控制器。所以你必须从那里指定命名空间。如果你有很多路由通向 Folder_a
中的控制器,你可以使用路由组来清理:
Route::group(['namespace' => 'Folder_a'], function(){
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
// more routes
});
我认为没有必要在文件夹中对控制器进行分组。您将主要为每个资源拥有 1 个控制器,并且每个资源都是它自己的东西。如果您有 50-100 个控制器,那也没什么问题。如果将它们放在文件夹中,最终会得到那么多文件夹,因此嵌套文件无济于事。
正常启动,然后在确实需要时进行重构。
其他答案都对,但是如果你想从web.php中删除文件夹名称,那么它就变成了
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
在你的控制器中从命名空间中删除 Folder_a,所以它变成了
命名空间App\Http\Controllers;
作曲家转储自动加载
我已经为这个问题苦苦挣扎了一个小时,我不确定我做错了什么。所以情况是这样的。我想创建一个控制器文件夹,将不同的控制器分组到他们的组中。默认情况下,laravel 个项目创建了这样的控制器文件夹结构
Http
--Controller
----Auth
所以我想做的就是做这样的东西
Http
--Controller
----Auth
----Folder_a
----Folder_b
----Folder_c
创建我的文件夹后,我文件夹中的控制器也像这样正确地命名空间
<?php namespace App\Http\Controllers\Folder_a;
/*
|--------------------------------------------------------------------------
| Use the main controller to allow extend to the main controller
|--------------------------------------------------------------------------
*/
use App\Http\Controllers\Controller;
class SomethingController extends Controller {
/* Do something here*/
}
最后在我的 routes.php 中,我称这样的动作为
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
但是当我尝试导航到该站点时,它给了我这个错误
ReflectionException in compiled.php line 1029:
Class App\Http\Controllers\SomethingController does not exist
注意到它仍然进入默认文件夹 App\Http\Controllers\ 以找到控制器,但如果我这样做的话
Route::get('/action1/', array('as' => 'action1', 'uses' => 'Folder_a\SomethingController@action1'));
那一切都会好起来的...这种情况下我做错了什么?我也试过 composer dump-autoload,没有任何改变。
你没有做错任何事。这是预期的行为! Laravel默认会搜索相对于App\Http\Controllers
的指定控制器。所以你必须从那里指定命名空间。如果你有很多路由通向 Folder_a
中的控制器,你可以使用路由组来清理:
Route::group(['namespace' => 'Folder_a'], function(){
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
// more routes
});
我认为没有必要在文件夹中对控制器进行分组。您将主要为每个资源拥有 1 个控制器,并且每个资源都是它自己的东西。如果您有 50-100 个控制器,那也没什么问题。如果将它们放在文件夹中,最终会得到那么多文件夹,因此嵌套文件无济于事。
正常启动,然后在确实需要时进行重构。
其他答案都对,但是如果你想从web.php中删除文件夹名称,那么它就变成了
Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
在你的控制器中从命名空间中删除 Folder_a,所以它变成了
命名空间App\Http\Controllers;
作曲家转储自动加载