106

我是 Laravel 的新手。为了尝试保持我的应用程序井井有条,我想将我的控制器放入控制器文件夹的子文件夹中。

controllers\
---- folder1
---- folder2

我试图路由到控制器,但 laravel 没有找到它。

Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');

我究竟做错了什么?

4

15 回答 15

137

对于以上 Laravel 5.3:

php artisan make:controller test/TestController

test如果文件夹不存在,这将创建该文件夹,然后TestController在其中创建。

TestController看起来像这样:

<?php
namespace App\Http\Controllers\test;

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

class TestController extends Controller
{
    public function getTest()
    {
        return "Yes";
    }
}

然后,您可以通过以下方式注册您的路线:

Route::get('/test','test\TestController@getTest');
于 2017-04-28T07:41:34.913 回答
74

在文件夹中添加控制器:

controllers\
---- folder1
---- folder2

创建您的路线而不指定文件夹:

Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');

composer dump-autoload

然后再试一次

于 2013-09-17T13:07:26.987 回答
51

对于使用 Laravel 5 的用户,您需要在子目录中为控制器设置命名空间(Laravel 5 仍在开发中,每天都在发生变化)

要获得如下文件夹结构:

Http
----Controllers
    ----Admin
            PostsController.php
    PostsController.php

命名空间 Admin\PostsController.php 文件如下:

<?php namespace App\Http\Controller\Admin;

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

那么你的路线是:

$router->get('/', 'Admin\PostsController@index');

最后,不要去做作曲家或工匠转储

composer dump-autoload

或者

php artisan dump
于 2014-11-15T07:23:15.800 回答
19

对于 ** Laravel 5 或 Laravel 5.1 LTS **,如果您在 Admin 文件夹中有多个控制器,Route::group将对您非常有帮助。例如:

更新:适用于 Laravel 5.4

我的文件夹结构:

Http
----Controllers
    ----Api
          ----V1
                 PostsApiController.php
                 CommentsApiController.php
    PostsController.php

PostAPI控制器:

<?php namespace App\Http\Controllers\Api\V1;

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

class PostApiController extends Controller {  
...

在我的 Route.php 中,我将namespace组设置为Api\V1,整体看起来像:

Route::group(
        [           
            'namespace' => 'Api\V1',
            'prefix' => 'v1',
        ], function(){

            Route::get('posts', ['uses'=>'PostsApiController@index']);
            Route::get('posts/{id}', ['uses'=>'PostssAPIController@show']);

    });

有关创建子文件夹的移动详细信息,请访问此链接

于 2015-05-24T02:20:23.227 回答
9

1.创建您的子文件夹,如下所示:

app
----controllers
--------admin
--------home

2.在 app/routes.php 中配置你的代码

<?php
// index
Route::get('/', 'Home\HomeController@index');

// admin/test
Route::group(
    array('prefix' => 'admin'), 
    function() {
        Route::get('test', 'Admin\IndexController@index');
    }
);
?>

3.在app/controllers/admin/IndexController.php中写下某事,例如:

<?php
namespace Admin;

class IndexController extends \BaseController {

    public function index()
    {
        return "admin.home";
    }
}
?>

4.访问你的站点,例如:localhost/admin/test 你会在页面上看到“admin.home”

ps:请忽略我的英语不好

于 2014-03-26T07:12:59.267 回答
8

在 Laravel 5.6 中,假设您的子文件夹的名称是Api

在您的控制器中,您需要这两行:

namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;

在您的路线文件api.php中,您需要:

Route::resource('/myapi', 'Api\MyController');
于 2018-02-21T12:26:05.447 回答
6

刚刚找到了一种方法:

只需将路径添加到 /app/start/global.php

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/controllers/product',
    app_path().'/models',
    app_path().'/database/seeds',

));
于 2013-09-17T13:19:18.197 回答
6
php artisan make:controller admin/CategoryController

这里 admin 是 app/Http/Controllers 下的子目录, CategoryController 是您要在目录中创建的控制器

于 2015-09-08T02:01:24.053 回答
5

我正在使用 Laravel 4.2。我是怎么做的:
我有一个像这样的目录结构:
app
--controllers
----admin
------AdminController.php

创建控制器后,我在 composer.json 中放入了新管理目录的路径:

"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/admin",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
}, 

接下来我跑了

composer dump-autoload

接着

php artisan dump-autoload

然后在 routes.php 我有这样的控制器:

Route::controller('admin', 'AdminController');

一切正常。

于 2014-06-07T12:49:48.980 回答
5

1)这就是您可以使您的应用程序井井有条的方式:

每个路由文件 ( web.php, api.php...) 都在map()方法中声明,在文件中

\app\Providers\RouteServiceProvider.php

当你映射一个路由文件时,你可以->namespace($this->namespace)为它设置一个,你会在示例中看到它。

这意味着您可以创建更多文件以使您的项目更有条理!

并为它们中的每一个设置不同的命名空间。

但我更喜欢empty string为命名空间设置""

2)您可以将控制器设置为以原生 php 方式路由,请参见示例:

Route::resource('/users', UserController::class);
Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');

现在,您可以在 IDE 中双击控制器名称以快速方便地到达那里。

于 2019-01-02T22:51:39.527 回答
5

如果您使用的是 Laravel 5.3 或更高版本,则无需像其他答案所说的那样陷入如此多的复杂性。只需使用默认的工匠命令来生成新的控制器。例如,如果我想在文件夹中创建一个User控制器。User我会输入

php artisan make:controller User/User

在路线中,

Route::get('/dashboard', 'User\User@dashboard');

这样做会很好,现在在 localhost/dashboard 上是页面所在的位置。

希望这可以帮助。

于 2017-04-24T02:25:40.737 回答
3

我认为将 Admin 和 Front 的控制器保存在单独的文件夹中,命名空间会很好地工作。

请查看下面的 Laravel 目录结构,这对我来说很好用。

app
--Http
----Controllers
------Admin
--------DashboardController.php
------Front
--------HomeController.php

“routes/web.php”文件中的路由如下

/* All the Front-end controllers routes will work under Front namespace */

Route::group(['namespace' => 'Front'], function () {
    Route::get('/home', 'HomeController@index');
});

对于管理部分,它看起来像

/* All the admin routes will go under Admin namespace */
/* All the admin routes will required authentication, 
   so an middleware auth also applied in admin namespace */

Route::group(['namespace' => 'Admin'], function () {
    Route::group(['middleware' => ['auth']], function() {            
        Route::get('/', ['as' => 'home', 'uses' => 'DashboardController@index']);                                   
    });
});

希望这可以帮助!!

于 2017-04-18T11:03:35.480 回答
1

我最近在使用 laravel 5.8 时遇到了这个问题,但我明白我应该像下面这样以正确的方式定义控制器:

php artisan make:controller SubFolder\MyController  // true

不像这样:

php artisan make:controller SubFolder/MyController  // false

然后你可以像这样访问 routes/web.php 中的控制器:

Route::get('/my', 'SubFolder\MyController@index');
于 2019-08-25T05:34:52.150 回答
0

在我的情况下,我必须为组中的每个路由添加一个前缀,否则响应将是找不到 UserController 类。

Route::prefix('/user')->group(function() {
    Route::post('/login', [UserController::class, 'login'])->prefix('/user');
    Route::post('/register', [UserController::class, 'register'])->prefix('/user');
});
于 2020-11-11T14:03:31.887 回答
-1

创建控制器转到 cmd 和类型 php artisan make:controller auth\LoginController

于 2021-01-14T14:11:37.143 回答