【问题标题】:Proper way to create controllers under a subfolder in laravel 5在 laravel 5 的子文件夹下创建控制器的正确方法
【发布时间】:2015-08-05 10:48:07
【问题描述】:

过去一小时我一直在努力解决这个问题,但我不确定我做错了什么。所以情况是这样的。我想创建一个控制器文件夹,将不同的控制器分组到他们的组中。默认情况下,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,没有任何改变。

【问题讨论】:

    标签: php laravel laravel-5 laravel-routing


    【解决方案1】:

    其他答案是对的,但是如果你想从web.php中删除文件夹名称,那么它就变成了

    Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
    
    1. 在您的控制器中,从命名空间中删除 Folder_a,使其变为

      命名空间 App\Http\Controllers;

    2. 作曲家转储自动加载

    【讨论】:

      【解决方案2】:

      我认为没有必要在文件夹中对控制器进行分组。每个资源通常都有一个控制器,每个资源都是它自己的东西。如果您有 50-100 个控制器,则没有什么问题。如果将它们放在文件夹中,最终会得到那么多文件夹,因此嵌套文件将无济于事。

      正常启动,如果你真的需要重构。

      【讨论】:

      • 我不太同意这一点。控制器根本不总是处理单个资源或资源。当您有针对管理员的自定义操作 (Admin\UserController) 时,子文件夹会派上用场,因此您不必在单个控制器中处理授权中间件(当前用户允许哪些方法,哪些不可以?)。另一个示例是构建 API 端点(API\V1、API\V2 等)。这些文件夹结构通常也与您的路线匹配(/admin/users、/api/v2)——对我来说,这看起来像是一个组织良好的应用程序结构。但通常情况下,这取决于您的应用程序大小:)
      • 是的,你是对的,我的回答可能漏掉了一些东西。我想的更像是 Folder_a 包含 AController,Folder_b 包含 BController。这就是为什么我认为这是一个坏主意
      • 是的,你是对的,在那种情况下它没有多大意义:P
      【解决方案3】:

      你没有做错任何事。这是预期的行为! Laravel 默认会搜索相对于App\Http\Controllers 的指定控制器。所以你必须从那里指定命名空间。如果您有许多路由指向Folder_a 中的控制器,您可以使用路由组进行清理:

      Route::group(['namespace' => 'Folder_a'], function(){
          Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));
          // more routes
      });
      

      【讨论】:

      • 我明白了...非常感谢您帮我清理问题...我以为我在这里和那里遗漏了什么...干杯队友:)
      猜你喜欢
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2015-05-31
      • 2020-10-13
      相关资源
      最近更新 更多