在 laravel 5 的子文件夹下创建控制器的正确方法

Posted

技术标签:

【中文标题】在 laravel 5 的子文件夹下创建控制器的正确方法【英文标题】:Proper way to create controllers under a subfolder in 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,没有任何改变。

【问题讨论】:

【参考方案1】:

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

Route::get('/action1/', array('as' => 'action1', 'uses' => 'SomethingController@action1'));

    在您的控制器中,从命名空间中删除 Folder_a,使其变为

    命名空间 App\Http\Controllers;

    作曲家转储自动加载

【讨论】:

【参考方案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
);

【讨论】:

我明白了...非常感谢您帮我清理问题...我以为我在这里和那里遗漏了什么...干杯队友:)

以上是关于在 laravel 5 的子文件夹下创建控制器的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

新鲜的 laravel lumen 找不到控制器驻留在控制器的子文件夹下

Laravel 5.2 HTTP(高级)路由与创建控制器

在 laravel 5 中找不到类控制器

Laravel 5.1 移除控制器

laravel5.5

Laravel 5 主页控制器