在子文件夹中定义Laravel 5路由并通过控制器显示它

4

我有一个Laravel 5.2.45应用程序。 我的控制器结构如下:

App
    Http
        Controllers
            Admin
                AdminController.php

在 AdminController.php 文件中,我有以下代码:

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests;

class AdminController extends Controller 
{

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct() 
{
    $this->middleware('auth');
    $this->middleware('is.admin');
}

public function index()
{
    return view('admin.home');
}

}

我有一个如下的views文件夹结构:

views
    admin
        home.blade.php

在我的routes.php文件中,我有以下内容:

Route::get('/admin/home', 'Admin\AdminController@index');

我正在尝试的是当我输入.../ admin / home时,浏览器在admin文件夹中显示home.blade.php。

我的routes.php文件:

Route::auth();

Route::get('/', 'FrontController@index');

Route::get('/home', 'FrontController@index');

Route::get('/add_user', 'FrontController@user');

Route::group(['prefix', 'admin', 'namespace' => 'Admin'], function() {
    Route::get('home', 'AdminController@index');
});

去掉前面的斜杠,使其变成:Route::get('admin/home', 'Admin\AdminController@index'); - Asher
3个回答

1
你可以使用命名空间和前缀选项来使用路由组。
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {
    Route::get('home', 'AdminController@index');
});

在这里,prefix 允许您指定 URL 的开头,它应始终位于组内的路由中。因此,您放置在该组中的任何路由都应以 admin 开头。
命名空间允许您为所引用的控制器指定文件夹/命名空间。因此,所有控制器必须在 App\Http\Controllers\Admin 命名空间和 app/Http/Controllers/Admin 文件夹中。

我刚刚尝试了一下,但是在RouteCollection.php的161行出现了NotFoundHttpException错误: 我在浏览器中输入了以下内容: http://localhost:8888/project/public/admin/home 控制器和视图都在正确的文件夹中,就像我在问题中提到的那样。 我尝试使用return view admin.home、admin/home、home等方式,但都没有成功。 - KondukterCRO
你能发布一下你的路由文件内容吗? - Jonathon
我们都错过了错误 - 'prefix' => 'admin' 而不是 'prefix', 'admin' 但感谢您的好建议。 - KondukterCRO

1

您的路由定义中缺少前缀。请将其更正为以下内容:

<?php
   Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() {
       Route::get('/home', 'AdminController@index');
   });

现在,请在浏览器中尝试输入base_url/admin/home,应该可以正常运行。

0

您需要删除前导斜杠,使其变为:

Route::get('admin/home', 'Admin\AdminController@index');


这样做无法解决问题,因为 Laravel 在注册路由时会修剪掉任何额外的前导斜杠。 - Chris White
是的,这个不起作用。和之前一样的问题。我已经尝试了每种组合。/admin/home、/home、home、admin/home、admin.home... - KondukterCRO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接