在 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'));
  1. 在你的控制器中从命名空间中删除 Folder_a,所以它变成了

    命名空间App\Http\Controllers;

  2. 作曲家转储自动加载