在 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 的子文件夹下创建控制器的正确方法的主要内容,如果未能解决你的问题,请参考以下文章