laravel 5中的子文件夹路由
Posted
技术标签:
【中文标题】laravel 5中的子文件夹路由【英文标题】:Subfolder routing in laravel 5 【发布时间】:2015-08-15 09:46:00 【问题描述】:我在路由子文件夹中的控制器时遇到问题。我已经尝试了Laravel Controller Subfolder routing 中提出的解决方案,但我无法让它工作。
文件夹结构
HTTP
Controllers
Admin
AdminControllers
User
UserControllers
BaseController
Admincontrollers 在 'App\HTTP\Controllers\Admin' 命名空间中定义
路由文件
Route::group(['middleware'=> 'admin','prefix' => 'admin'], function()
Route::get('home', 'AdminHomeController@index');
Route::get('home', 'Admin\AdminHomeController@index');
Route::resource('events', 'AdminEventController');
Route::resource('events', 'Admin\AdminEventController');
Route::get('myevents', 'AdminEventController@myevents');
Route::get('myevents', 'Admin\AdminEventController@myevents');
Route::resource('groups', 'AdminGroupController');
Route::resource('users', 'AdminUserController');
);
这看起来确实很奇怪,但这是让它立即正常工作的唯一方法。 如果我删除
Route::get('myevents', 'Admin\AdminEventController@myevents');
//errormessage Class App\Http\Controllers\AdminEventController does not exist
如果我删除
Route::get('myevents', 'AdminEventController@myevents');
//errormessage Action App\Http\Controllers\AdminEventController@myevents not defined.
如果我将控制器放在控制器命名空间中(不是管理员命名空间) 我还是得到了
//errormessage Class App\Http\Controllers\AdminEventController does not exist
当添加的唯一路由是
Route::resource('events', 'AdminEventController');
【问题讨论】:
您是否尝试过完全限定的控制器名称?例如。Route::get('home', 'App\Http\Controllers\Admin\AdminHomeController@index');
我的猜测是 Laravel(或者可能是作曲家自动加载器)试图猜测你指的是什么并且弄错了。
这不是诀窍,但新的错误给了我一个想法,现在已经修复了
【参考方案1】:
问题在于视图中的调用:
改变
<td>!!html::linkAction('AdminEventController@show', $event->name, $event->slug)!!</td>
到
<td>!!Html::linkAction('Admin\AdminEventController@show', $event->name, $event->slug)!!</td>
修复它。
Laravel Controller Subfolder routing 中的 Laravel 5 解决方案是正确的。问题不在路由文件或控制器中。
【讨论】:
【参考方案2】:是的,如果您的应用程序变得像这样变得更大,那么使用子文件夹构建控制器是有意义的。但这比只是在这里和那里移动文件需要更多的努力。让我解释一下结构。
例如,我们希望有一个子文件夹 app/Http/Controllers/Admin,然后在其中我们有我们的 AdminController.php,这很好。我们需要在文件本身内部做的事情:
正确的命名空间——指定内部文件夹:
namespace App\Http\Controllers\Admin;
使用控制器——从你的内部命名空间 Laravel 不会“理解”扩展控制器,所以你需要添加这个:
use App\Http\Controllers\Controller;
Routes – 指定完整路径 这不再起作用了:
Route::get('admin', 'AdminController@index');
这是正确的方法:
Route::get('admin', 'Admin\AdminController@index');
就是这样——现在您可以从子文件夹中使用您的控制器了。
参考(已测试): http://laraveldaily.com/moving-controllers-to-sub-folders-in-a-correct-way/ 作者:波维拉斯·科罗普
【讨论】:
以上是关于laravel 5中的子文件夹路由的主要内容,如果未能解决你的问题,请参考以下文章