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中的子文件夹路由的主要内容,如果未能解决你的问题,请参考以下文章

路由到 Laravel 5 子文件夹中的控制器

Laravel 5 子文件夹路由

在子文件夹中使用 Laravel 时如何编写路由

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

laravel5.5路由

Laravel 5.1的多路由文件的配置